zoukankan      html  css  js  c++  java
  • Spring基本功能依赖注入

    一、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的销毁方法

  • 相关阅读:
    深入了解 Flink 网络栈(二):监控、指标和处理背压
    物联网安全技术提高区块链应用数据的可信度
    威胁快报|Bulehero挖矿蠕虫升级,PhpStudy后门漏洞加入武器库
    Ververica Platform-阿里巴巴全新Flink企业版揭秘
    重磅 | 阿里云与MongoDB达成战略合作,成为全球唯一提供最新版MongoDB的云厂商
    阿里巴巴叶军:政企数字化转型,现在是最重要的时机
    Canonical 开源 MicroK8 | 云原生生态周报 Vol. 25
    nyoj42——连通图加欧拉(连通图板子)dfs
    nyoj38——最小生成树
    nyoj20——有向无环图深搜模板
  • 原文地址:https://www.cnblogs.com/jiyukai/p/6820623.html
Copyright © 2011-2022 走看看