本文spring libs 地址:https://github.com/yizhiamumu/springlibsjava
读做“反转控制”更好理解。将本来在程序中手动建立对象的控制权,交由Spring框架来管理。python
在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。git
咱们直接在对象内部经过new进行建立对象,是程序主动去建立依赖对象;而IoC是有专门一个容器来建立这些对象,即由Ioc容器来控制对象的建立;github
主要控制了外部资源获取。web
有反转就有正转,传统应用程序是由咱们本身在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙建立及注入依赖对象;spring
为什么是反转?由于由容器帮咱们查找及注入依赖对象,对象只是被动的接受依赖对象,因此是反转;数据库
依赖对象的获取被反转了。编程
1.建立员工类缓存
Employee.java安全
public class Employee { /** 系统id */ private int id; /** 员工编号 */ private String employeeNo; /** 员工姓名 */ private String employeeName; /** 员工性别 */ private String sex; /** 出生日期 */ private Date birthDay; /** 部门编号 */ private String officeNo; /** 岗位编号 */ private String postNo; /** 入职时间 */ private Date entryTime; /** 特长 */ private String speciality; /** 兴趣爱好 */ private String hobby; /** setter and getter */ }
2.建立测试方法,并调用构造函数建立对象。
TestSpringEmp.java
public class TestSpringEmp { public static void main(String[] args) { Employee emp = new Employee(); System.out.println(emp); } }
1.idea 工程添加Spring相关jar包。【libs 上传至git 地址,操做方法见附录】
2.建立配置文件,能够自定义文件名spring.xml。
3.调用API。
1.在spring.xml中配置bean标签,IOC容器经过加载bean标签来建立对象。
2.调用API获取IOC建立的对象。
两种方式
2.1 经过id获取对象
//1.加载spring.xml配置文件 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml"); //2.经过id值获取对象 Employee emp = (Employee) applicationContext.getBean("emp"); System.out.println(emp);
2.2 经过运行时类获取对象
注意: 当spring.xml中配置两个Employee的bean时程序报错,由于此时两个bean都是由Employee类生成的,IOC容器没法将两个bean都返回。
spring.xml
<bean id="emp1" class="com.spring.model.Employee"> <property name="id" value="1"></property> </bean> <bean id="emp2" class="com.spring.model.Employee"> <property name="id" value="2"></property> </bean>
TestSpringEmp.java
//1.加载spring.xml配置文件 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml"); //2.经过运行时类获取对象 Employee emp = applicationContext.getBean(Employee.class); System.out.println(emp);
spring.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 配置员工 Employee 对象--> <bean id="emp" class="com.spring.model.Employee"></bean> </beans>
TestSpringEmp.java
import com.spring.model.Employee; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class TestSpringEmp { public static void main(String[] args) { //1.加载spring.xml配置文件 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml"); //2.经过id值获取对象 Employee emp = (Employee) applicationContext.getBean("emp"); System.out.println(emp); } }
第一步:加载spring.xml配置文件,生成ApplicationContext对象。
第二步:调用ApplicationContext的getBean方法获取对象,参数为配置文件中的id值。
程序在加载spring.xml时建立stu对象,经过反射机制调用无参构造函数,全部要求交给IOC容器管理的类必须有无参构造函数。
调用无参构造只会建立对象而不会进行赋值,如何赋值呢?只须要在spring.xml中进行相关配置便可。
添加property标签:name对应属性名,value是属性的值。
注:若包含特殊字符,好比name="<一只阿木木>",使用<![CDATA[<一只阿木木>]]>进行配置。
spring.xml
<property name="id" value="1"></property> <property name="employeeNo" value="10001"></property> <property name="employeeName" value="一只阿木木"></property> <property name="sex" value="1"></property> <property name="birthDay" value="1990-08-15"></property> <property name="officeNo" value="7"></property> <property name="postNo" value="1"></property> <property name="entryTime" value="2018-07-01"></property> <property name="speciality" value="java,python"></property> <property name="hobby"> <value><![CDATA[<漫画>]]></value> </property>
在实体类中建立有参构造
Employee.java
public Employee(int id, String employeeNo, String employeeName) { super(); this.id = id; this.employeeNo = employeeNo; this.employeeName = employeeName; }
spring.xml
<!-- 经过有参构造函数建立对象 -->
<bean id="emp3" class="com.spring.model.Employee">
<constructor-arg name="id" value="3"></constructor-arg>
<constructor-arg name="employeeNo" value="10001"></constructor-arg>
<constructor-arg name="employeeName" value="一只阿木木"></constructor-arg>
</bean>
除了使用name对应参数外,还能够经过下标index对应。
<!-- 经过有参构造函数建立对象 -->
<bean id="emp3" class="com.spring.model.Employee">
<constructor-arg index="0" value="3"></constructor-arg>
<constructor-arg index="1" value="10001"></constructor-arg>
<constructor-arg index="2" value="一只阿木木"></constructor-arg>
</bean>
建立工做经历类 job.java
public class Job { /** 序号 */ private int id; /** 单位名称 */ private String companyName; /** 职位名称 */ private String position; /** 工做薪水 */ private BigDecimal salary; /** setter and getter */ }
在员工Employee 类中添加工做经历job 类:
Employee.java
/** 工做经历类*/ private Job job; /** 系统id */ private int id; /** 员工编号 */ private String employeeNo; /** 员工姓名 */ private String employeeName;
spring.xml中配置Job 对象,而后将该对象赋值给emp 对象。
spring.xml
<!-- 建立job 对象 --> <bean id="job" class="com.spring.model.Job"> <property name="id" value="1"></property> <property name="companyName" value="阿木木国际集团"></property> <property name="position" value="研发副总监"></property> <property name="salary" value="10000.00"></property> </bean> <!-- 建立emp对象 --> <bean id="emp" class="com.spring.model.Employee"> <property name="id" value="1"></property> <property name="employeeNo" value="10001"></property> <property name="employeeName"> <value><![CDATA[<一只阿木木>]]></value> </property> <!-- 将job 对象赋给emp 对象--> <property name="job" ref="job"></property> </bean> </bean>
在spring.xml中,经过ref属性将其余bean赋给当前bean对象,这种方式叫作依赖注入(DI),是Spring很是重要的机制,DI是将不一样对象进行关联的一种方式,是IOC的具体实现方式,一般DI和IOC是紧密结合在一块儿的,因此通常说的IOC包括DI。
Job 类中添加List<Employee>属性。
Job.java
/** List<Employee>属性*/ private List<Employee> employeeList;
spring.xml中配置2个emp对象,1个job对象,并将2个emp对象注入到job对象中。
spring.xml
<bean id="job" class="com.spring.model.Job"> <property name="id" value="1"></property> <property name="companyName" value="阿木木国际集团"></property> <property name="position" value="研发副总监"></property> <property name="salary" value="10000.00"></property> <property name="emp"> <!-- 注入emp对象 --> <list> <ref bean="emp"/> <ref bean="emp2"/> </list> </property> </bean> <bean id="emp" class="com.spring.model.Employee"> <property name="id" value="1"></property> <property name="employeeNo" value="10001"></property> <property name="employeeName"> <value><![CDATA[<一只阿木木>]]></value> </property> </bean> <bean id="emp2" class="com.spring.model.Employee"> <property name="id" value="2"></property> <property name="employeeNo" value="10002"></property> <property name="employeeName"> <value><![CDATA[<两只阿木木>]]></value> </property> </bean>
集合属性经过list标签和ref标签完成注入。ref的bean属性指向须要注入的bean对象。
2004年大师级人物Martin Fowler:“依赖注入”明确描述了“被注入对象依赖IoC容器配置依赖对象”。
DI—Dependency Injection,即“依赖注入”:咱们只须要经过简单的配置,而无需任何代码就可指定目标须要的资源,完成自身的业务逻辑,而不须要关心具体的资源来自何处,由谁实现。
理解DI的关键是:“谁依赖谁,为何须要依赖,谁注入谁,注入了什么”。
其实它们是同一个概念的不一样角度描述。
IoC 是spring的核心,全部的类的建立、销毁都由 spring来控制,也就是说控制对象生存周期的再也不是引用它的对象,而是spring。由spring来负责控制对象的生命周期和对象间的关系,这叫控制反转。
Java 1.3以后一个重要特征是反射(reflection),它容许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性,spring就是经过反射来实现注入的。IoC的一个重点是在系统运行中,动态的向某个对象提供它所须要的其余对象。这一点是经过DI(Dependency Injection,依赖注入)来实现的。
控制的什么被反转了?就是:得到依赖对象的方式反转了。
IOC是典型的工厂模式,IOC经过工厂模式建立bean有两种方式:
1.1 建立工做实体类
job.java
public class Job { /** 序号 */ private int id; /** 单位名称 */ private String companyName; /** 职位名称 */ private String position; public Job(int id, String companyName, String position) { super (); this.id = id; this.companyName = companyName; this.position = position; } public Job() { super(); } @Override public String toString() { return "Job [id=" + id + ", companyName=" + companyName + ", postion=" + position + " ]"; } }
1.2 建立静态工厂类,静态工厂方法。
StaticFactoryJob.java
private static Map<Integer, Job> jobs; static { jobs = new HashMap<>(); jobs.put(1, new Job(1, "猫厂", "p7")); jobs.put(2, new Job(2, "鹅厂","T2")); } public static Job getJob(int id) { return jobs.get(id); }
1.3 在spring.xml中配置静态工厂。
spring.xml
<!-- 配置静态工厂建立job对象 -->
<bean id="job1" class="com.spring.model.StaticFactoryJob" factory-method="getJob">
<constructor-arg value="1"></constructor-arg>
</bean>
factory-method指向静态方法。
constructor-arg 的value属性为调用静态方法所传的参数。
1.4 在测试类中直接获取job1对象。 TestSpringStatic.java
public static void main(String[] args) throws SQLException { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml"); Job job = (Job) applicationContext.getBean("job1"); System.out.println(job); } // 打印:Job [id=1, companyName=猫厂, postion=p7 ]
2.1 建立实例工厂类,工厂方法 。
InstanceFactoryJob.java
private Map<Integer, Job> jobs; public InstanceFactoryJob() { jobs = new HashMap<>(); jobs.put(1, new Job(1, "猫厂", "p7")); jobs.put(2, new Job(2, "鹅厂", "T2")); } public Job getJob(int id) { return jobs.get(id); }
2.2 spring.xml 中配置 bean
spring.xml
<!-- 配置实例工厂对象 -->
<bean id="jobFactory" class="com.spring.model.InstanceFactoryJob"></bean>
<!-- 经过实例工厂对象建立car对象 -->
<bean id="job2" factory-bean="jobFactory" factory-method="getJob">
<constructor-arg value="2"></constructor-arg>
</bean>
2.3 在测试类中直接获取car2对象
public static void main(String[] args) throws SQLException { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml"); Job job = (Job) applicationContext.getBean("job2"); System.out.println(job); } // 打印: Job [id=2, companyName=鹅厂, postion=T2 ]
静态工厂方法的方式建立job对象,不须要实例化工厂对象,由于静态工厂的静态方法,不须要建立对象便可调用。因此spring.xml只须要配置一个Job bean,而不须要配置工厂bean。
实例工厂方法建立job对象,必须先实例化工厂对象,由于调用的是非静态方法,必须经过对象调用,不能直接经过类来调用,因此spring.xml中须要先配置工厂bean,再配置Job bean。
自动装载有两种方式:
1 新建BaseEmployee.java 类
public class BaseEmployee { /** 系统id */ private int id; /** 员工编号 */ private String employeeNo; /** 员工姓名 */ private String employeeName; /** 工做经历*/ private Job job; /** setter and getter */ @Override public String toString() { return "BaseEmployee [id=" + id + ", employeeNo=" + employeeNo + ", employeeName=" + employeeName + ", job=" + job + "]"; } }
2 spring.xml中配置Car bean和Person bean,并经过自动装载进行依赖注入。
spring.xml
<!--autowire="byName"表示经过匹配属性名的方式去装载对应的bean, BaseEmployee实体类中有 job 属性,因此就将id="job"的bean注入到baseEmployee中--> <bean id="emp" class="com.spring.model.BaseEmployee" autowire="byName"> <property name="id" value="1"></property> <property name="employeeNo" value="10001"></property> <property name="employeeName" value="一只阿木木"></property> </bean> <bean id="job" class="com.spring.model.StaticFactoryJob" factory-method="getJob"> <constructor-arg value="2"></constructor-arg> </bean>
注意:经过property标签手动进行car的注入优先级更高,若两种方式同时配置,以property的配置为准。
3 测试类中获取baseEmployee 对象。
TestSpringBaseEmployee.java
public class TestSpringBaseEmployee { public static void main(String[] args) { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml"); BaseEmployee emp = (BaseEmployee) applicationContext.getBean("emp"); System.out.println(emp); } }
知识点:使用byType进行自动装载时,spring.xml中只能配置一个装载的bean。
1.spring.xml
<bean id="emp" class="com.spring.model.BaseEmployee" autowire="byType"> <property name="id" value="1"></property> <property name="employeeNo" value="10001"></property> <property name="employeeName" value="一只阿木木"></property> </bean> <bean id="job" class="com.spring.model.StaticFactoryJob" factory-method="getJob"> <constructor-arg value="2"></constructor-arg> </bean> <!--<bean id="job2" class="com.spring.model.StaticFactoryJob" factory-method="getJob"> <constructor-arg value="2"></constructor-arg> </bean>-->
2.测试类中获取person对象
TestSpringBaseEmployee.java
// 打印:BaseEmployee [id=1, employeeNo=10001, employeeName=一只阿木木, job=Job [id=2, companyName=鹅厂, postion=T2 ]]
经典三层架构:Controller层,Service层,DAO层。
有两种方式:
BaseEmployee.java
public class BaseEmployee { /** 系统id */ private int id; /** 员工编号 */ private String employeeNo; /** 员工姓名 */ private String employeeName; public BaseEmployee(int id, String employeeNo, String employeeName) { super(); this.id = id; this.employeeNo = employeeNo; this.employeeName = employeeName; } public BaseEmployee() { super(); } @Override public String toString() { return "BaseEmployee [id=" + id + ", employeeNo=" + employeeNo + ", employeeName=" + employeeName + "]"; } /** setter and getter */ }
BaseEmployeeDao.java
public interface BaseEmployeeDao { public BaseEmployee getBaseEmpById(int id); }
BaseEmployeeDaoImpl.java
public class BaseEmployeeDaoImpl implements BaseEmployeeDao{ private static Map<Integer,BaseEmployee> baseEmployee; static{ baseEmployee = new HashMap<Integer,BaseEmployee>(); baseEmployee.put(1, new BaseEmployee(1, "10001", "一只阿木木")); baseEmployee.put(2, new BaseEmployee(2, "10002", "两只阿木木")); baseEmployee.put(3, new BaseEmployee(3, "10003", "三只阿木木")); } @Override public BaseEmployee getBaseEmpById(int id) { // TODO Auto-generated method stub return baseEmployee.get(id); } }
建立BaseEmployeeService 接口以及实现类BaseEmployeeServiceImpl。
BaseEmployeeService
public interface BaseEmployeeService { public BaseEmployee getBaseEmpById(int id); }
BaseEmployeeServiceImpl.java
public class BaseEmployeeServiceImpl implements BaseEmployeeService { private BaseEmployeeDAO baseEmployeeDAO; public BaseEmployeeDAO getBaseEmployeeDAO() { return baseEmployeeDAO; } public void setBaseEmployeeDAO(BaseEmployeeDAO baseEmployeeDAO) { this.baseEmployeeDAO = baseEmployeeDAO; } @Override public User getBaseEmpById(int id) { // TODO Auto-generated method stub return baseEmployeeDAO.getBaseEmpById(id); } }
BaseEmployeeController.java
public class BaseEmployeeController { private BaseEmployeeService baseEmployeeService; public BaseEmployeeService getBaseEmployeeService() { return baseEmployeeService; } public void setBaseEmployeeService(BaseEmployeeService baseEmployeeService) { this.baseEmployeeService = baseEmployeeService; } public BaseEmployee getBaseEmpById(int id){ return baseEmployeeService.getBaseEmpById(id); } }
在spring.xml配置Controller,Service,DAO,并完成依赖注入。 spring.xml
<!-- 配置BaseEmployeeController --> <bean id="baseEmployeeController" class="com.spring.controller.BaseEmployeeController"> <property name="baseEmployeeService" ref="baseEmployeeService"></property> </bean> <!-- 配置BaseEmployeeService --> <bean id="baseEmployee" class="com.spring.service.BaseEmployeeServiceImpl"> <property name="baseEmployeeDAO" ref="baseEmployeeDAO"></property> </bean> <!-- 配置BaseEmployeeDAO --> <bean id="baseEmployeeDAO" class="com.spring.dao.BaseEmployeeDaoImpl"></bean>
TestSpringBaseEmployee.java
public static void main(String[] args) { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml"); BaseEmployeeController baseEmployeeController = (BaseEmployeeController) applicationContext.getBean("baseEmployeeController"); BaseEmployee baseEmployee = baseEmployeeController.getBaseEmpById(1); System.out.println(baseEmployee); }
第一步:将Controller,Service,DAO类扫描到IOC容器中。
第二步:在类中设置注解完成依赖注入。
1 修改 spring.xml
知识点:引入context 命名空间
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> <!-- 将类扫描到IOC容器中 --> <context:component-scan base-package="com.spring"></context:component-scan> </beans>
2 修改DAOImpl
改动:在类名处添加@Repository注解,表示该类是数据接口层。
@Repository public class BaseEmployeeDaoImpl implements BaseEmployeeDao{ private static Map<Integer,BaseEmployee> baseEmployee; static{ baseEmployee = new HashMap<Integer,BaseEmployee>(); baseEmployee.put(1, new BaseEmployee(1, "10001", "一只阿木木")); baseEmployee.put(2, new BaseEmployee(2, "10002", "两只阿木木")); baseEmployee.put(3, new BaseEmployee(3, "10003", "三只阿木木")); } @Override public BaseEmployee getBaseEmpById(int id) { // TODO Auto-generated method stub return baseEmployee.get(id); } }
3 修改ServiceImpl。
@Service public class BaseEmployeeServiceImpl implements BaseEmployeeService{ @Autowired private BaseEmployeeDAO baseEmployeeDAO; @Override public BaseEmployee getBaseEmpById(int id) { // TODO Auto-generated method stub return baseEmployeeDAO.getBaseEmpById(id); } }
4 修改 Controller类,添加注解。
有两处改动:
BaseEmployeeControler.java
@Controller public class BaseEmployeeController { @Autowired private BaseEmployeeService baseEmployeeService; public BaseEmployee getBaseEmpById(int id){ return baseEmployeeService.getBaseEmpById(id); } }
自动装载除了byType的方式,还能够结合@Qualifier注解, 使用byName的方式。
知识点:@Qualifier()中的值必须与@Service()中的值一致,才能完成自动装载。
BaseEmployeeControler.java
@Controller public class BaseEmployeeController { @Autowired @Qualifier("baseEmployeeService") private BaseEmployeeService baseEmployeeService; public BaseEmployee getBaseEmpById(int id){ return baseEmployeeService.getBaseEmpById(id); } }
基于注解的方式咱们并无给bean设置id,byName的方式是经过属性名去匹配对应bean的id属性值。
添加注解时,类名首字母小写以后的值就是id的默认值。IOC容器中默认赋值,BaseEmployeeService bean的id=baseEmployeeService,与Controller中的属性名一致
@Service public class BaseEmployeeServiceImpl implements BaseEmployeeService
BaseEmployeeService bean的id=sortBaseEmployeeService。
@Service("sortBaseEmployeeService") public class BaseEmployeeServiceImpl implements BaseEmployeeService{ @Autowired private BaseEmployeeDAO baseEmployeeDAO; @Override public BaseEmployee getBaseEmpById(int id) { // TODO Auto-generated method stub return baseEmployeeDAO.getBaseEmpById(id); } }
Controller中的Service属性也须要去匹配name=sortBaseEmployeeService的bean,因此设置@Qualifier("sortBaseEmployeeService")。
@Controller public class BaseEmployeeController { @Autowired @Qualifier("sortBaseEmployeeService") private BaseEmployeeService baseEmployeeService; public BaseEmployee getBaseEmpById(int id){ return baseEmployeeService.getBaseEmpById(id); } }
spring IoC的思想:依赖注入就是A开放接口,将B传递进来(注入);控制反转,AB双方不相互依赖,整个活动的进行由第三方负责管理。
控制反转,由容器建立组件对象,而后注入参数创建应用关系。
例如EmployeeDao调用Data,由Spring容器建立EmployeeDao和Data对象,而后再由容器将Data对象注入给EmployeeDao中的属性。
Data注入途径能够是set方法,也能够是带参数构造器等。
EmployeeDao类在编写时,须要定义一个set方法或带参数构造器,参数类型为Data。
public class EmployeeDao { private Data data; //1 set 方法注入 private void setData(Data data) { this.data = data; } //2 带参数构造器注入 private EmployeeDao(Data data) { this.data = data; } }
<!--原理,利用反射建立对象(无参构造器), 而后利用反射注入参数--> <bean id="" class=""> <property name="" value|ref=""></property> </bean> <!--原理:利用反射直接调用带参数构造器建立对象--> <bean id="" class=""> <constructor-arg index="" value|ref=""></constructor-arg> </bean>
List 属性使用 <list> 元素定义注入,使用多个 <ref> 元素的 Bean 属性去引用以前定义好的 Bean
<property name="list"> <list> <ref bean="bean1"/> <ref bean="bean2"/> </list> </property>
Map 属性使用 <map> 元素定义注入,使用多个 <entry> 元素的 key-ref 属性去引用以前定义好的 Bean 做为键,而用 value-ref 属性引用以前定义好的 Bean 做为值
<property name="map"> <map> <entry key-ref="keyBean" value-ref="valueBean"/> </map> </property>
Set 属性使用 <set> 元素定义注入,使用多个 <ref> 元素的 bean 去引用以前定义好的 Bean
<property name="set"> <set> <ref bean="bean"/> </set> </property>
须要引入其声明
<!-- 引入 c-命名空间以前 --> <bean name="emp1" class="spring.Employee"> <constructor-arg name="id" value="1" /> <constructor-arg name="name" value="姓名1"/> </bean> <!-- 引入 c-命名空间以后 --> <bean name="emp2" class="spring.Employee" c:id="2" c:name="姓名2"/> <!--参数的索引。XML中不容许数字做为属性的第一个字符,所以添加一个下划线来做为前缀。--> <bean name="emp2" class="spring.Employee" c:_0="2" c:_1="姓名2"/>
c-命名空间经过构造器注入的方式来配置 bean,p-命名空间则是用setter的注入方式来配置 bean
<!-- 引入p-命名空间以前 --> <bean name="emp1" class="spring.Employee"> <property name="id" value="1" /> <property name="name" value="姓名1"/> </bean> <!-- 引入p-命名空间以后 --> <bean name="emp2" class="spring.Employee" p:id="2" p:name="姓名2"/> <!--属性须要注入其余 Bean 的话也能够在后面跟上 -ref--> <bean name="emp2" class="spring.Employee" p:id="2" p:name="姓名2" p:cdCard-ref="cdCard1"/>
工具类的命名空间,能够简化集合类元素的配置
<!-- 引入util-命名空间以前 --> <property name="list"> <list> <ref bean="bean1"/> <ref bean="bean2"/> </list> </property> <!-- 引入util-命名空间以后 --> <util:list id="list"> <ref bean="bean1"/> <ref bean="bean2"/> </util:list>
【src】文件下新建一个 bean.xml
在 applicationContext.xml 文件中写入:
<import resource="bean.xml" />
一切须要 Spring IoC 去寻找 Bean 资源的地方均可以用到
@Primary 注解:
@Qualifier 注解:
/* 包名和import */ public class SpringZhujie { ...... @Autowired @Qualifier("source1") public void setSource(Source source) { this.source = source; } }
经过 @Component 注解来装配 Bean ,而且只能注解在类上,当你须要引用第三方包的(jar 文件),并且每每并无这些包的源码,这时候将没法为这些包的类加入 @Component 注解,让它们变成开发环境中的 Bean 资源。
@Configuration 注解至关于 XML 文件的根元素,解析其中的 @Bean 注解
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class TestBean { @Bean(name = "testBean") public String test() { String str = "测试@Bean注解"; return str; } }
因为Java语言自己的类反射功能,使得仅凭一个配置文件,就能魔法般地实例化并装配好程序所用的Bean。容器启动时,Spring根据配置文件的描述信息,自动实例化Bean并完成依赖关系的装配,从容器中便可返回准备就绪的Bean实例,后续可直接使用之。
本文spring libs 地址:https://github.com/yizhiamumu/springlibs
公众号:一只阿木木
博客园:http://www.cnblogs.com/yizhiamumu/
github : https://github.com/yizhiamumu/