从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. PHP抓取页面中的邮箱

    <?php $url='http://www.cnblogs.com/tinyphp/p/3234926.html'; //当页已留邮箱 $content=file_get_contents($ ...

  2. linux ntfs模块

    步骤: 1.在/usr/src/linux-2.4.18-3/configs/目录下 找适合自己机器的内核配置文件.我用的kernel-2.4.18-x86_64.config,把它拷贝到/usr/s ...

  3. Eclipse中设置中文件javadoc

    Eclipse中设置中文件javadoc 在Eclipse中,我们常常看一些英文的JavaDoc提示或者没有相应的提示是很不习惯的,如下图所示: 我们现在要把这种不习惯的提示改为中文的JavaDOC提 ...

  4. Confman - 针对「Node 应用」的配置文件加载模块

    一句话介绍 confman 是一个强大的配置文件加载器,无论你喜欢 yaml .cson.json.properties.plist.ini.toml.xml 还是 js,都能满足你的愿望,并且更加简 ...

  5. 在线分享Oracle尖峰时刻--2014年中秋节尖峰在线福利!

    **********************************************************            2014年中秋节尖峰在线福利!*************** ...

  6. 织梦(DEDE)CMS V5.3 覆盖任意变量导致远程包含漏洞

    漏洞版本: 织梦(DEDE)CMS V5.3 漏洞描述: 织梦内容管理系统,最强大的中文开源CMS网站管理项目,使用PHP+MySQL架构. 在文件include/common.inc.php中: f ...

  7. TestNG测试带参构造函数的类

    今天被同事问到一个问题,问题描述如下: 一个测试类,只有一个带参构造函数.在带参构造函数上加@Test,同时加@Parameters注解从testng.xml中传递参数.为保证测试函数在带参构造函数之 ...

  8. 折叠伸缩工具栏 CollapsingToolbarLayout

    PS:这是一个超级超级垃圾的控件,强烈建议放弃使用! demo地址:https://github.com/baiqiantao/CollapsingDemo.git  一个类似的效果的库,有800个星 ...

  9. c#实现随鼠标移动窗体

    private void MainForm_Load(object sender, EventArgs e) { //绑定事件 MouseMove += Form_MouseMove; MouseDo ...

  10. MS SQL 中判断 数据库, 存储过程,表,临时表,视图,函数,用户,用户创建对象 等是否存在 SQL脚本

    摘自: http://www.111cn.net/database/mssqlserver/39107.htm sql判断存储过程是否存在 判断数据库教程是否存在 Sql代码 if exists (s ...