Spring注解-原理和实战

1.Autowired

前提:所有bean,如果加了名称,按照用户自定义的名称来作为beanName;如果不加,按照类名首字母转小写的结果作为beanName

  • @Autowired 根据类型注入, 
  • @Resource 默认根据名字注入,其次按照类型搜索
  • @Autowired @Qualifier("userService") 两个结合起来可以根据名字和类型注入

解释:

    假设现在有个类 :

 @Service 
 public class UserServiceImpl implements UserService { 
   ...
 }

 @Controller
 public class AoneMessageHandlerController {

    @Autowired
    private UserService userService;
    ....
 }

 

   单个的@Autowired注解,会按照类型注入,这样就会自动找到UserService这个类型以及他的实现类型。

   但是当UserService实现类有两个以上的时候,就会有冲突,spring容器不知道要加载哪一个。启动是会报错:

    ...required a single bean,but 2 were found;

    如果还用@Autowired,就需要按名称指定要加载哪一个bean。

  (1)此时可以在@service上写好名称,并在引用的地方用@Qualifier注解指定按哪个名称找。

 (2)可以@Autowired的时候,直接用具体的实现类,比如 @Autowired  private UserServiceImpl2 userService;

 (3)还可以用set来做,@Autowired  private Set<UserService> UserServiceSet; 这样就把所有实现类都加载进来了。

 @Service("userService") 
 public class UserServiceImpl implements UserService { 
   ...
 }

 @Service("userService2")  
 public class UserServiceImpl2 implements UserService { 
   ...
 }

 @Controller
 public class AoneMessageHandlerController {

    @Autowired
    @Qualifier("userService")   //如果上面的名称没有定义的话,用("userServiceImpl")也是可以的
    private UserService userService;
    ....
 }

  required属性:可以为true( 默认值)和false。如果为true的话,没有匹配的类则抛出异常;如果为false,则表示不是强制必须能够找到相应的类,无论是否注入成功,都不会抛错。   

    @Resouce注解 ,如果指定name、type属性,则按照属性去找。如果什么属性都不配置,默认按照名称进行匹配,此时用来查询的name是变量名。如果没有找到相同名称的Bean,则会按照类型进行匹配。(bean名称的规则在最上面)

     查找细节:

  1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常

  2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常

  3. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常 

  4. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配;

 上面的例子:

   (1)按名称,@Resouce(name="userService2") ,@Resouce 没有value属性,需要用name字段来指定名称

(2)名称没找到,就按照类型去找,如果找到俩实现类,也会报错。

一般来讲,spring会先加载注解标记的bean,然后加载beans.xml中配置的bean。如果扫描注解,在注入类中引用的其他bean时,会查找是否加载过这些bean

  原理:

2.Configuration

  用 @Configuation可以实现beans.xml配置文件一样的功能。例如:

@Configuration
@ImportResource("classpath:initBeans.xml")
public class InitConfig {
}

 @Configuation等价于<Beans></Beans>

 @Bean等价于<Bean></Bean>

 @ComponentScan等价于<context:component-scan base-package=”com.dxz.demo”/>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值