美文网首页
Spring IoC容器之类路径扫描及组件管理

Spring IoC容器之类路径扫描及组件管理

作者: 夏与清风 | 来源:发表于2019-07-14 15:55 被阅读0次

    通过类扫描路径的方式来隐式检测候选组件,候选组件是匹配过滤条件的类库,并有在容器中注册对应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开始支持。

    \bullet @Inject

    @javax.inject.Inject可以代替@Autowired注解,和@Autowired一样,它可以在字段、方法或构造器参数级别使用,示例如下:

    import javax.inject.Inject;

    public class TestBean {

        private MessageServiceservice;

        @Inject

        public void setService(MessageService service) {this.service = service;}

    }

    \bullet @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开发大全》

    相关文章

      网友评论

          本文标题:Spring IoC容器之类路径扫描及组件管理

          本文链接:https://www.haomeiwen.com/subject/dhbvkctx.html