Spring IOC 开发中基于注解的配置
1. 定义 Bean
@Component("UserDao")
public class UserDao {
...
}
使用 @Component 注解在类上进行标注,标注后的类可以被 Spring 识别, Spring 容易自动将类转换为容易管理的 Bean。
除了 @Component 外, spring 还提供了 3 个功能基本与 @Component 等效的特定注解:
-
@Repository:用于对 DAO 实现类进行标注。
-
@Service:用于对 Service 实现类进行标注。
-
@Controller:用于对 Controlle 实现类进行标注。
这 3 个注解作用与 @Component 完全一样,完全可以用 @Component 替代。
但是,还是推荐使用特定的注解进行标注特定的 Bean,毕竟这样一眼就能看出 Bean 的真实身份。
2. 自动装配 Bean
1. 使用 @Autowired 自动注入
Spring 通过 @Autowired 注解实现 Bean 的依赖注入。
@Autowired 可作用于类属性或方法上。
@Service
public class LogonService {
// 分别注入 LogDao 和 LogDao 的 Bean
@Autowierd
private LogDao logDao;
@Autowierd
private UserDao userDao;
...
}
@Autowired 默认按类型(byType)匹配的方式在容器中查找匹配的 Bean,当有且仅有一个匹配的 Bean 时,Spring 将其注入 @Autowired 标注的变量中。
2. 使用 @Autowired 的 required 属性
如果容器中没有一个和标注变量类型匹配的 Bean,那么 Spring容器启动时就会抛出 NoSuchBeanDefinitionException 异常。
如果希望匹配不到时也不要抛出异常,可以使用 @Autowired(required = false) 进行标注。
@Service
public class LogonService {
@Autowierd(required = false)
private LogDao logDao;
...
}
默认情况下,@Autowired 的 required 属性值为 true。
3. 使用 @Qualifier 指定注入 Bean 的名称
如果容器拥有一个以上匹配的 Bean 时,则可以通过 @Qualifier 注解限定 Bean 的名称。
@Service
public class LogonService {
@Autowierd
private LogDao logDao;
// 注入名为 userDao1,类型为 UserDao 的 Bean
@Autowierd
@Qualifier("userDao1")
private UserDao userDao;
...
}
就假设容器有两个类型为 UserDao 的 Bean,一个名为 userDao1,另一个名为 userDao2,则这里就会注入名为 userDao1 的 Bean。
4. 对类方法进行标注
@Autowierd 可以对成员变量及方法的参数进行标注。
@Service
public class LogonService {
private LogDao logDao;
private UserDao userDao;
@Autowierd
public void setLogDao(LogDao logDao){
...
}
// 将名为 UserDao 的 Bean 传给方法参数
@Autowierd
@Qualifier("UserDao")
public void setUserDao(UserDao userDao){
...
}
// @Qualifier 也可以写在参数前面,给指定的参数进行注入
@Autowierd
public void init(@Qualifier("UserDao")UserDao userDao, LogDao logDao){
...
}
}
虽然 Spring 支持在属性和方法上标注自动注入注解 @Autowierd,但实际开发中建议采用在方法上标注 @Autowierd 注解,因为这样更符合面向对象。
5. 懒加载@Lazy
也叫延迟加载,即在 Spring 容器启动的时候,对于在 Bean 上标注 @Lazy 及 @Autowierd 注解的属性,不会立即注入属性值,而是到调用此属性的时候才会注入属性值。
...
@Lazy //标注懒加载
@Repositoey
public class LogDao{
}
@Service
public calss LogonService implements BeanNameAware{
@Lazy //标注懒加载
@Autowierd
public void setLogDao(LogDao logDao){...}
}
要注意的是 @Lazy 注解必须同时标注在属性及目标 Bean 上,二者缺一则无效。
@Resource
@Resource 与 @Autowierd 的作用类似,都是提供自动注入的功能。
不同的是,@Resource 是按名称匹配注入。@Resource 要球提供一个 Bean 名称的属性,如果属性为空,则自动采用标注处的变量名或方法名作为 Bean 的名称。
public class Boss {
private Car car;
//注入名为 car 的 Bean
@Resource("car")
private void setCar(Car car){
...
}
}
@Resource 是按名称匹配注入 Bean,@Autowierd 默认按类型匹配注入 Bean。
但是@Resource 的功能没有 @Autowierd丰富,@Autowierd 和 @Qualifier结合则能代替 @Resource 。