1 使用注解创建bean
1.2 创建bean的注解有以下几个
- @Repository
它用于将数据访问层 (DAO 层 ) 的类标识为 Spring Bean
@Repository 只能标注在 DAO 类上呢?
这是因为该注解的作用不只是将类识别为Bean,同时它还能将所标注的类中抛出的数据访问异常封装为 Spring 的数据访问异常类型 - @Service
通常作用在业务层,但是目前该功能与 @Component 相同。 - @Controller
通常作用在控制层,但是目前该功能与 @Component 相同。 @Component
是一个泛化的概念,仅仅表示一个组件 (Bean) ,可以作用在任何层次。在类上使用@Component注解,表示该类定义为Spring管理Bean,使用默认value(可选)属性表示Bean标识符。@AspectJ风格的切面可以通过@Compenent注解标识其为Spring管理Bean,而@Aspect注解不能被Spring自动识别并注册为Bean,必须通过@Component注解来完成,
@Named不仅可以用于依赖注入来指定注入的Bean的标识符,还可以用于定义Bean。即注解在类型上表示定义Bean,注解在非类型上(如字段)表示指定依赖注入的Bean标识符。
通过在类上使用 @Repository、@Component、@Service 和 @Constroller 注解,Spring会自动创建相应的 BeanDefinition 对象,并注册到 ApplicationContext 中。这些类就成了 Spring受管组件。这三个注解除了作用于不同软件层次的类,其使用方式与 @Repository 是完全相同的。另外,除了上面的四个注解外,用户可以创建自定义的注解,然后在注解上标注 @Component,那么,该自定义注解便具有了与所@Component 相同的功能。不过这个功能并不常用。
当一个 Bean 被自动检测到时,会根据那个扫描器的 BeanNameGenerator 策略生成它的 bean名称。默认情况下,对于包含 name 属性的 @Component、@Repository、 @Service 和@Controller,会把 name 取值作为 Bean 的名字。如果这个注解不包含 name值或是其他被自定义过滤器发现的组件,默认 Bean 名称会是小写开头的非限定类名。如果你不想使用默认 bean命名策略,可以提供一个自定义的命名策略。
@Lazy:定义Bean将延迟初始化,
@Component("component")
@Lazy(true)
public class TestCompoment {
……
}
@DependsOn:定义Bean初始化及销毁时的顺序,使用方式如下:
@Component("component")
@DependsOn({"managedBean"})
public class TestCompoment {
……
}
@Scope:定义Bean作用域,默认单例,使用方式如下:
@Component("component")
@Scope("singleton")
public class TestCompoment {
……
}
@Primary:自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常,
@Component("component")
@Primary
public class TestCompoment {
……
}
2 注解实现Bean依赖注入
- @Required:依赖检查;基于@Required的依赖检查表示注解的setter方法必须,即必须通过在XML配置中配置setter注入,如果没有配置在容器启动时会抛出异常从而保证在运行时不会遇到空指针异常,@Required只能放置在setter方法上,且通过XML配置的setter注入
- @Autowired:自动装配,用于替代基于XML配置的自动装配基于@Autowired的自动装配,默认是根据类型注入,可以用于构造器、字段、方法注入。@Autowired默认是根据参数类型进行自动装配,且必须有一个Bean候选者注入,如果允许出现0个Bean候选者需要设置属性“required=false”,“required”属性含义和@Required一样,只是@Required只适用于基于XML配置的setter注入方式
- @Value:注入SpEL表达式;
用于注入SpEL表达式,可以放置在字段方法或参数上,使用方式如下:
@Value(value = “SpEL表达式”)
字段、方法、参数
1、可以在类字段上使用该注解:
@Value(value = “#{message}”)
private String message;
2、可以放置在带@Autowired注解的方法的参数上:
@Autowired
public void initMessage(@Value(value = “#{message}#{message}”) String message) {
this.message = message;
} - 还可以放置在带@Autowired注解的构造器的参数上:
@Autowired
private TestBean43(@Value(value = “#{message}#{message}”) String message) {
this.message = message;
} - @Qualifier:限定描述符,用于细粒度选择候选者;
@Autowired默认是根据类型进行注入的,因此如果有多个类型一样的Bean候选者,则需要限定其中一个候选者,否则将抛出异常
@Qualifier限定描述符除了能根据名字进行注入,但能进行更细粒度的控制如何选择候选者,具体使用方式如下: - @Resource:自动装配,默认根据类型装配,如果指定name属性将根据名字装配。和@Autowired不同的是可以指定name来根据名字注入。
使用@Resource需要注意以下几点:
@Resource注解应该只用于setter方法注入,不能提供如@Autowired多参数方法注入;
@Resource在没有指定name属性的情况下首先将根据setter方法对于的字段名查找资源,如果找不到再根据类型查找;
@Resource首先将从JNDI环境中查找资源,如果没找到默认再到Spring容器中查找,因此如果JNDI环境中有和Spring容器同名的资源时需要注意。 - @PostConstruct和PreDestroy:通过注解指定初始化和销毁方法定义;
- @Inject:等价于默认的@Autowired,只是没有required属性;
- @Named:指定Bean名字,对应于Spring自带@Qualifier中的缺省的根据Bean名字注入情况