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”/>