一、Spring的依赖注入(DI)

  1.1 xml形式注入 

  (1)普通变量的注入

//普通变量的注入,xml配置property,实体类配置set方法注入
<bean id="person" class="com.jyk.spring.simpletest.Person">
<property name="id" value="1"></property>
<property name="name" value="tom"></property>
</bean> public class Person { public String id;
public String name;
public void setId(String id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
} public void printInfo(){
System.out.println("id=="+id);
System.out.println("name=="+name);
}
}

  (2)对象的引用注入,该种形式的xml配置灵活,建议使用内部bean的配置形式

//多对象的引用注入,同样可采用常规的xml配置,对象中配置set方法来实现注入
<bean id="dao" class="com.jyk.spring.simpletest.Dao">
</bean> <bean id="service" class="com.jyk.spring.simpletest.Service">
<property name="dao" ref="dao"></property>
</bean> <bean id="action" class="com.jyk.spring.simpletest.Action">
<property name="service" ref="service"></property>
</bean> //内部bean的配置形式   <bean id="action" class="com.jyk.spring.simpletest.Action">

    <property name="service">
      <bean class="com.jyk.spring.simpletest.Service">
        <property name="dao">
          <bean class="com.jyk.spring.simpletest.Dao"></bean>
        </property>
      </bean>
    </property>
  </bean>

public class Action {

    private Service service;

    public void setService(Service service) {
this.service = service;
} public void execute(){
service.execute();
}
} public class Service { private Dao dao; public void setDao(Dao dao) {
this.dao = dao;
} public void execute(){
dao.execute();
}
} public class Dao { public void execute(){
System.out.println("dao执行逻辑");
}
}

    (3)p 名称空间给对象的属性注入值(该功能仅Spring3.0以上支持)

<bean id="person" class="com.jyk.spring.simpletest.Person" p:id="1" p:name="cat"></bean>
<bean id="dao" class="com.jyk.spring.simpletest.Dao"></bean>

<bean id="service" class="com.jyk.spring.simpletest.Service" p:dao-ref="dao"></bean>

<bean id="action" class="com.jyk.spring.simpletest.Action" p:service-ref="service"></bean>

    (4)装配list,set,map,properties集合

 <bean id="person" class="com.jyk.spring.simpletest.Person">
</bean> <bean id="person1" class="com.jyk.spring.simpletest.Person1">
<property name="list">
<list>
<value>list1</value>
<value>list2</value>
<ref bean="person"/>
</list>
</property>
<property name="set">
<set>
<value>set1</value>
<value>set2</value>
<ref bean="person"/>
</set>
</property>
<property name="map">
<map>
<entry key="key1">
<value>map1</value>
</entry>
<entry key="key2">
<value>map2</value>
</entry>
</map>
</property>
<property name="properties">
<props>
<prop key="01">prop1</prop>
<prop key="02">prop2</prop>
</props>
</property>
</bean> public class Person1 { private List list;
private Map map;
private Set set;
private Properties properties;
public void setList(List list) {
this.list = list;
}
public void setMap(Map map) {
this.map = map;
}
public void setSet(Set set) {
this.set = set;
}
public void setProperties(Properties properties) {
this.properties = properties;
} public void printInfo(){
System.out.println("list=="+list);
System.out.println("map=="+map);
System.out.println("set=="+set);
System.out.println("properties=="+properties);
}
}

   1.2 自动装配

     什么是自动装配?就是对属性,方法参数,引用的其他bean,无需通过property的形式来配置,而是通过一定的自动装配策略,交由Spring进行自动适配和装载。强烈建议使用自动装配,因为扩展性高,代码可维护性强,比如在java代码中新增一个属性或引用,只需添加set方法,以及配置文件中配置对应的bean即可。而且自动装配也可以显著减少bean配置的繁琐过程。

     (1)byName 根据属性名自动装配。此选项将检查容器并根据名字查找与属性完全一致的bean,并将其与属性自动装配。

public class Action {

    private Service service;

    public void setService(Service service) {
this.service = service;
} public void execute(){
service.execute();
}
} public class Service { private Dao dao; public void setDao(Dao dao) {
this.dao = dao;
} public void execute(){
dao.execute();
}
} public class Dao { public void execute(){
System.out.println("dao执行逻辑");
}
} <bean id="dao" class="com.jyk.spring.simpletest.Dao"></bean> <bean id="service" class="com.jyk.spring.simpletest.Service" autowire="byName"></bean> <bean id="action" class="com.jyk.spring.simpletest.Action" autowire="byName"></bean>

    (2)byType 如果容器中存在一个与指定属性类型相同的bean,那么将与该属性自动装配。如果存在多个该类型的bean,那么将会抛出异常,并指出不能使用byType方式进行自动装配。若没有找到相匹配的bean,则什么事都不发生,属性也不会被设置。如没找到匹配的bean需要抛出异常,则可以通过设置通过设置 
                     dependency-check="objects"来使Spring抛出异常。

<bean id="dao" class="com.jyk.spring.simpletest.Dao"></bean>

<bean id="service" class="com.jyk.spring.simpletest.Service" autowire="byType"></bean>

<bean id="action" class="com.jyk.spring.simpletest.Action" autowire="byType"></bean>

      (3)constructor 与byType的方式类似,不同之处在于它应用于构造器参数。如果在容器中没有找到与构造器参数类型一致的bean,那么将会抛出异常。并且 constructor会优先查找参数比较多的构造函数

      (4) autodetect 通过bean类的自省机制(introspection)来决定是使用constructor还是byType方式进行自动装配。如果发现默认的构造器,那么将使用byType方式

   1.3 注解形式注入

      Spring提供了一系列注解,通过在Java类中添加各种注解,同样可以达到依赖注入的效果。

     @Autowired注解是按类型装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它required属性为false。

     @Resource注解默认按名称装配,如果没有指定name属性,并且按照默认的名称找不到依赖对象时, @Resource注解会回退到按类型装配。但一旦指定了name属性,就只能按名称装配了。

     区别:@Resource注解和@Autowired一样,都可以标注在字段或属性的setter方法上,不同的是当@Resource注解标注在字段上,即默认取字段的名称作为bean名称寻找依赖对象,当@Resource注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找依赖对象。而@Autowired则是以bean类型为基准。

     @Qualifier注解按名称装配。

@PostConstruct 指定Bean的初始化方法

       @PreDestroy 指定Bean的销毁方法

最新文章

  1. js倒计时显示
  2. 决战JS
  3. [Architecture Design] 3-Layer基础架构
  4. C语言 常用的时间函数
  5. How to check “hasRole” in Java Code with Spring Security?
  6. 删除Windows 文本右键选项
  7. poi大数据将excel2007导入数据库
  8. ManyToMany OrderBy
  9. 卷积神经网络的变种: PCANet
  10. eMMC真能优化成UFS?谈谈手机闪存的文件系统
  11. python代码块和小数据池
  12. 洛谷P1309 瑞士轮(归并排序)
  13. LOJ-10102(求A到B之间的割点)
  14. 用 Docker 构建、运行、发布来一个 Spring Boot 应用
  15. 20155333 2016-2017-2 《Java程序设计》第六周学习总结
  16. 《Android进阶之光》--RxJava结合Retrofit访问网络
  17. 解决pip下载速度慢
  18. INTEST/EXTEST SCAN 的学习
  19. 【刷题】BZOJ 4000 [TJOI2015]棋盘
  20. JDBC Statement对象执行批量处理实例

热门文章

  1. js学习笔记25----Event对象
  2. [android] AndroidManifest.xml - 【 manifest -&gt; 其他次要配置】
  3. java-I/O File类(5)-Reader和Writer、OutputStreamWriter 、BufferedWriter、字节流和字符流的区别
  4. 【BZOJ】1621: [Usaco2008 Open]Roads Around The Farm分岔路口(dfs)
  5. CentOS切换桌面模式和命令行模式
  6. js 版本号
  7. HTTP报文--&gt;MVC
  8. InstallSheild 获取系统环境变量,如Desktop路径等
  9. Amazon(iam)IAM用户启用MFA
  10. Linq------错误:EntityType: EntitySet &#39;Products&#39; is based on type &#39;Product&#39; that has no keys defined.