通过类扫描路径的方式来隐式检测候选组件,候选组件是匹配过滤条件的类库,并有在容器中注册对应bean的定义。开发者可以使用注解、AspectJ风格的表达式、自定义的过滤条件来选择哪些类有在容器中注册bean。
1、@Component及其同义的注解
spring2.5引入了更多典型注解,如@Component、@Repository、@Service、@Controller等。@Component注解是对受spring过滤组件的通用注解。@Repository、@Service、@Controller注解分别对应持久层、服务层和表现层。可以使用@Component注解自己的组件类,若使用@Repository、@Service、@Controller来替代,则这些类更适合由工具来处理或与切面进行关联。
2、元注解
元注解就是能被应用到另一个注解上的注解。
元注解可以被用于创建组合注解,如springMVC中的@RestController就是@Controller和@ResponseBody。组合注解可能从元注解中任意重新声明属性来允许用户自定义。如下是一个自定义的@Scope注解,将作用域名称指定到@Session注解上,也允许自定义proxyMode。
SessionScope定义 @SessionScope可以不声明proxyMode就使用 为proxyMode重载一个值3、自动检测类并注册bean定义
spring可以自动检测类并在ApplicationContext中注册对应的BeanDefinition。示例如下:
要自动检测这些类并注册对应的bean,需要添加@ComponentScan到@Configuration类上,其中的base-package元素是这两个类的公共父类包,可以任意选择使用逗号、分号、空格分隔的列表将每个类引入父包。示例如下:
或者使用XML配置:
<context:component-scan>隐式的开启了<context:annotation-config>功能,因此无需再使用<context:annotation-config>。
4、使用过滤器来自定义扫描
默认情况下@Component、@Repository、@Service、@Controller注解,或使用进行自定义的@Component注解的类本身仅用于检测候选组件,开发者可以修改并扩展这种行为,只需应用自定义的过滤器,即在@ComponentScan注解中添加include-filter或exclude-filter参数即可。每个过滤器元素需要type和expression属性。
过滤器选项及描述 使用Stub库来代替Repository注解 使用XML方式来配置JSR-330规范注解
JSR-330是Java依赖注入的标准规范,从spring3.0开始支持。
@Inject
@javax.inject.Inject可以代替@Autowired注解,和@Autowired一样,它可以在字段、方法或构造器参数级别使用,示例如下:
import javax.inject.Inject;
public class TestBean {
private MessageServiceservice;
@Inject
public void setService(MessageService service) {this.service = service;}
}
@Named和@ManagedBean
@javax.inject.Named和javax.annotation.ManagedBean可以代替@Component。示例如下:
import javax.inject.Named;
import javax.inject.Inject;
@Named("testBean") //等同于@ManagedBean("testBean")
public class TestBean {
private MessageServiceservice;
@Inject
public void setService(MessageService service) {this.service = service;}
}
当使用@javax.inject.Named和javax.annotation.ManagedBean注解时,可以与使用spring注解相同的方式使用组件扫描。
@Configuration
@ComponentScan(basePackages ="com.xlws")
public class AppConfig {}
--参考文献《Srping5开发大全》
网友评论