zoukankan      html  css  js  c++  java
  • @Autowired和@Resource装配

    从Spring2.5開始就能够使用注解自己主动装配Bean的属性。

    使用注解自己主动装配与XML中使用autowire属性自己主动装配并没有太大区别。
    Spring容器默认禁用注解装配。

    所以在基于注解自己主动装配。我们须要在Spring配置中启用它。如:<context:annotation-config/>
    <context:annotation-config/>他的作用是向Spring容器注冊

    AutowiredAnnotationBeanPostProcessor(@Autowired

    CommonAnnotationBeanPostProcessor(@ Resource 、@ PostConstruct、@ PreDestroy等注解)

    PersistenceAnnotationBeanPostProcessor(@PersistenceContext)

    RequiredAnnotationBeanPostProcessor (@Required)

    这四个BeanPostProcessor。

    总是须要依照传统的方式一条一条配置显得有些繁琐和没有必要。于是spring给我们提供<context:annotation-config/>的简化配置方式,自己主动帮你完毕声明。


    Spring另一个配置<context:component-scan base-package=”cn.com.xx.xx”/>能替代<context:annotation-config/>,我们后面在说。


    @Autowired的使用

    使用@Autowired我们得知道它是依照byType自己主动装配的,能够无需写set方法。甚至不会受限于privatekeyword。即使是私有实例变量。它仍然能够被自己主动装配。

    是不是感觉@Autowired注解没有不论什么限制?实际上会有两种情况出现异常:

    1、假设没有匹配到Bean

    能够使用@Autowired(required=false)即时没有匹配到也不会异常,而是将值设置为null。来看看@Autowired注解源代码:

    @Target({ElementType.CONSTRUCTOR, ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface Autowired {
    
    	/**
    	 * Declares whether the annotated dependency is required.
    	 * <p>Defaults to {@code true}.
    	 */
    	boolean required() default true;//required默认是true,必须满足依赖否则异常,我们能够将这个值改为fasle改变这一行为
    
    }


    2、假设存在多个匹配的Bean

    能够使用@Qualifier("users")来注入ID为users的Bean。来看看@Qualifier注解源代码:

    @Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, ElementType.ANNOTATION_TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Inherited
    @Documented
    public @interface Qualifier {
    
    	String value() default "";//默认是空字符串,也就是不指定匹配的Bean ID,必要时我们能够指定value的值(也就是Bean的ID)这时候会依照byName去自己主动装配
    
    }



    以下来看下样例:

    public class Roles {  
        private int id;  
        private String roleName; 
        @Autowired
        private Users users;
        //@Autowired(required=false)//即时没匹配到ID为users也不会异常,而是null
        //@Qualifier("users")//获得ID为users的Bean
        //private Users users;
        
    	public int getId() {
    		return id;
    	}
    	public void setId(int id) {
    		this.id = id;
    	}
    	public String getRoleName() {
    		return roleName;
    	}
    	public void setRoleName(String roleName) {
    		this.roleName = roleName;
    	}
    	//没有users的get,set方法
    	
    	//重写toString方法,方便測试  
    	@Override  
    	public String toString() {  
    		return "Roles [id=" + id + ", roleName=" + roleName + ", users="  
    				+ users + "]";  
    	}
    }
    public class Users {  
        private int id;  
        private String name; 
    	//省略set get方法  
    	
    	@Override  
    	public String toString() {  
    		return "Users [id=" + id + ", name=" + name + "]";  
    	}
    }  

    	<bean id="roles" class="cn.com.ztz.spring.model.Roles">
    		<property name="id" value="1"/>
    		<property name="roleName" value="管理员"/>
    	</bean>
    	<bean id="users" class="cn.com.ztz.spring.model.Users">
    		<property name="id" value="2"/>
    		<property name="name" value="张三"/>
    	</bean>
    	<context:annotation-config/>

    执行測试方法:

    @RunWith(SpringJUnit4ClassRunner.class)  
    @ContextConfiguration(locations={"classpath:spring.xml"})  
    public class JunitTest {
    	@Autowired
    	private Roles roles;
    	@Test
    	public void testSpring(){
    		
    		System.out.println(roles);
    	}
    }


    输出结果:

    Roles [id=1, roleName=管理员, users=Users [id=2, name=张三]]


    @resource跟@Autowired的差别

    @resource注解事实上跟@Autowired几乎相同的,他们的差别是:

    1、@resource是JDK的。@Autowired是Spring的

    2、@resource依照byName自己主动装配,@Autowired依照byType自己主动装配。

    @Autowired装配顺序

    1、spring先找类型为users的bean
    2、假设存在且唯一,则OK
    3、假设不唯一。寻找name为users的bean。

    由于bean的name有唯一性,所以,到这里应该能确定是否存在满足要求的bean了
    @Autowired也能够手动指定依照byName方式注入,使用@Qualifier标签,比如:
    @Autowired()
    @Qualifier("users" )


    @Resource装配顺序

      1. 假设同一时候指定了name和type。则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
      2. 假设指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
      3. 假设指定了type。则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个。都会抛出异常
      4. 假设既没有指定name,又没有指定type,则自己主动依照byName方式进行装配。假设没有匹配。则回退为一个原始类型进行匹配。假设匹配则自己主动装配。


    ps:有哪不正确的地方。还请指出。




  • 相关阅读:
    “TensorFlow 开发者出道计划”全攻略,玩转社区看这里!
    适合 C++ 新手学习的开源项目——在 GitHub 学编程
    【9303】平面分割
    【u114】旅行计划(12月你好)
    【u236】火炬
    【u233】单词化简
    Java Web整合开发(41) -- Forum
    1、服务器(软件)种类
    jquery trigger
    jQuery实现当按下回车键时绑定点击事件
  • 原文地址:https://www.cnblogs.com/lytwajue/p/7304990.html
Copyright © 2011-2022 走看看