从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:有哪不正确的地方。还请指出。

@Autowired和@Resource装配的更多相关文章

  1. @autowired和@resource的区别

    @Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自 动注入罢了.@Resource有两个属性是比较重要的, ...

  2. @Autowired 与@Resource的区别

    1.@Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上. 2  @Autowired默认按类型装配(这个注解是属业spring的),默认情况下 ...

  3. java @Autowired与@Resource的区别

    @Autowired与@Resource的区别     1.@Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上. 2.@Autowired默认 ...

  4. @Autowired与@Resource的区别

    1.@Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上. 2.@Autowired默认按类型装配(这个注解是属业spring的),默认情况下必 ...

  5. Spring 注释 @Autowired 和@Resource

    一. @Autowired和@Resource都可以用来装配bean,都可以写在字段上,或者方法上. 二. @Autowired属于Spring的:@Resource为JSR-250标准的注释,属于J ...

  6. Spring 注释 @Autowired 和@Resource 的区别

    Spring 注释 @Autowired 和@Resource 的区别 一. @Autowired和@Resource都可以用来装配bean,都可以写在字段上,或者方法上. 二. @Autowired ...

  7. Spring注解@Component、@Repository、@Service、@Controller,@Autowired、@Resource用法

    一.Spring定义bean,@Component.@Repository.@Service 和 @Controller Spring 2.5 中除了提供 @Component 注释外,还定义了几个拥 ...

  8. @Autowired与@Resource的差别

    1.@Autowired与@Resource都能够用来装配bean. 都能够写在字段上,或写在setter方法上. 2.@Autowired默认按类型装配(这个注解是属业spring的),默认情况下必 ...

  9. @Autowired与 @Resource

    @Autowired, @Resource 1.注解类型: Autowired可用于构造器.属性.方法.注解 @Target({ElementType.CONSTRUCTOR, ElementType ...

随机推荐

  1. 降压转换器 (Buck)

    降压转换器 (Buck) 切换式降压转换器 (Buck) 能提供高效率.高度弹性.高压降比.高负载能力的降压转换. 多数降压转换器 (Buck) 包含上桥 MOSFET 和同步整流 MOSFET,根据 ...

  2. 获得sql server的table的表结构 -- 转到word中

    SQL语句: select syscolumns.name,systypes.name,syscolumns.length from syscolumns  join sysobjects on sy ...

  3. Eclipse 结合Tomcat开发Web应用

    第一部分 配置Tomcat 先到Apache官方网站下载Tomcat:http://tomcat.apache.org/.  但是在你下载Tomcat时,首选确定你的Eclipse支持的Tomcat版 ...

  4. 【spring】RestTemplate发送请求,请求第三方接口 的几种请求方式POST,GET,DELETE,PUSH

    org.springframework.web.client.RestTemplate 参考地址:http://www.cnblogs.com/UniqueColor/p/7123347.html G ...

  5. 检查正则表达式的工具:Regex Match Tracer

    Regex Match Tracer破解版下载 使用: 相关: 收藏几个好用的在线正则验证网

  6. MNI模板和Talairach 模板的对比

    The MNI brain and the Talairach atlas SPM 96 and later use standard brains from the Montreal Neurolo ...

  7. MySQL Cluster(MySQL 集群) 初试

    MySQL Cluster 是MySQL适合于分布式计算环境的高实用.高冗余版本.它采用了NDB Cluster 存储引擎,允许在1个 Cluster 中运行多个MySQL服务器.在MyQL 5.0及 ...

  8. Latex 语法总结——层次结构

    层次结构~~documentclass[a4paper,11pt]{article}\usepackage{CJKutf8}\usepackage[top=1in, bottom=1in, left= ...

  9. OpenCV特征点检测

    特征点检测 目标 在本教程中,我们将涉及: 使用 FeatureDetector 接口来发现感兴趣点.特别地: 使用 SurfFeatureDetector 以及它的函数 detect 来实现检测过程 ...

  10. 由学习《软件设计重构》所想到的代码review(一)

    前言 对于一个程序猿来讲怎样来最直接的来衡量他的技术能力和产出呢?我想最直观的作法是看他的代码编写能力,就拿我常常接触的一些程序猿来看,他们买了非常多技术重构类书籍.可是看完后代码编写能力并没有显著提 ...