Spring MVC系列-(2) Bean的装配

栏目: IT技术 · 发布时间: 4年前

内容简介:Spring容器负责创建应用程序中的bean,并通过DI来协调对象之间的关系。Spring提供了三种主要的装配机制:推荐使用Java配置类结合隐式的自动bean扫描机制。

Spring MVC系列-(2) Bean的装配

2. Bean的装配

Spring容器负责创建应用程序中的bean,并通过DI来协调对象之间的关系。Spring提供了三种主要的装配机制:

  • XML显式配置;
  • Java配置类进行显式配置;
  • 隐式的bean发现机制和自动装配。

推荐使用 Java 配置类结合隐式的自动bean扫描机制。

2.1 通过XML装配Bean

XML配置是Spring刚出现时的主要配置方式。这种方式需要手动编写XML,并在其中配置好Bean的定义。

创建XML并定义Bean

下面是Person类的定义,

public class Person {
    private String name;
    private Integer age;
    
    public Person(){
        super();
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Person(String name, Integer age) {
        super();
        this.name = name;
        this.age = age;
    }
    public Integer getAge() {
        return age;
    }
    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + "]";
    }
    public void setAge(Integer age) {
        this.age = age;
    }
}

可以在XML进行如下的配置,设置了bean id以及相应的属性值。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="person">
        <property name="name" value="vincent"></property>
        <property name="age" value="19"></property>
    </bean>
</beans>

获取Bean

在使用Bean时,可以直接利用应用上下文进行加载XML,

//把beans.xml的类加载到容器
ApplicationContext app = new ClassPathXmlApplicationContext("beans.xml");

//从容器中获取bean
Person person = (Person) app.getBean("person");
        
System.out.println(person);

2.2 通过Java配置类装配Bean

在进行显式配置时,Java配置类是更好的方案,因为它更为强大,类型安全并且对重构友好。

创建Java配置类

创建Java配置类的关键在于为其添加 @Configuration 注解,表明这个类是一个配置类。在这种方式下,不需要XML配置文件。

下面的例子中,往容器中注册了一个Person的Bean实例。

//配置类====配置文件
@Configuration
public class MainConfig {
    //给容器中注册一个bean, 类型为返回值的类型, 
    @Bean("myPerson")
    public Person person(){
        return new Person("vincent",20);
    }
}

修改bean id有两种方法:

  1. 修改返回bean的方法名,上面的例子中,bean id默认为person。可以将其修改为person1(),则id变为person01
  2. 直接在@Bean中指定,上面的例子,bean id为myPerson

获取Bean

可以直接使用 AnnotationConfigApplicationContext 加载配置类,并获取Bean。

public class MainTest2 { 
    public static void main(String args[]){
        
        // 利用configure类配置bean实例
        ApplicationContext app = new AnnotationConfigApplicationContext(MainConfig.class);
        
        //从容器中获取bean
        Person person = (Person) app.getBean("myPerson");
        System.out.println(person);
        
        // 获取所有的bean name
        String [] beanNameList = app.getBeanDefinitionNames();
        for (String name : beanNameList) {
            System.out.println(name);
        }
    }
}

2.3 自动化装配Bean

除了上面介绍的XML和Java配置类来进行Bean的装配,Spring还支持自动化装配。

声明配置类

同样的,在自动化装配Bean时,也需要声明Java配置类,

@Configuration
@ComponentScan(value = "com.enjoy.cap2", includeFilters = {
        @Filter(type=FilterType.CUSTOM, classes = {JamesTypeFilter.class})
}, useDefaultFilters = false)

public class Cap2MainConfig {
    //给容器中注册一个bean, 类型为返回值的类型, 
    @Bean
    public Person person01(){
        return new Person("james",20);
    }
}

所不同的是,加入了 ComponentScan 注解,该注解会启动组件扫描,默认情况下会扫描与配置类相同的包,如果查找到了带有Component注解的类,会自动创建对应的bean并放置到容器中。

定义被扫描的组件

在Spring 2.5之后,引入了3个注解 @Repository@Service@Controller 。这些组件都可以被自动扫描并且加载到容器中。

相比较而言, @Component 是一个通用的Spring容器管理的单例bean组件。而@Repository, @Service, @Controller就是针对不同的使用场景所采取的特定功能化的注解组件。因此,当你的一个类被@Component所注解,那么就意味着同样可以用@Repository, @Service, @Controller来替代它,同时这些注解会具备有更多的功能,而且功能各异。

总结如下:

  • @Component :最普通的组件,可以被注入到spring容器进行管理
  • @Repository :作用于持久层
  • @Service :作用于业务逻辑层
  • @Controller :作用于表现层(spring-mvc的注解)

定义组件的方式很简单,直接在定义好的类上面使用注解即可。此外,可以在定义组件的同时,指定组件的名称,

@Controller("testController")
public class OrderController {}

定制包扫描的过滤规则

在下面的例子中,加入 @Filter 来定制扫描规则。

@ComponentScan(value="com.enjoy.cap2",
includeFilters={                    @Filter(type=FilterType.ANNOTATION,classes={Controller.class}), @Filter(type=FilterType.ASSIGNABLE_TYPE,classes={BookService.class})
},
useDefaultFilters=false)

其中需要设置如下的参数:

  • value:指定要扫描的包
  • excludeFilters = Filter[]: 指定扫描的时候按照什么规则排除那些组件
  • includeFilters = Filter[]: 指定扫描的时候只需要包含哪些组件
  • useDefaultFilters = false: 默认是true,扫描所有组件,要改成false

扫描的Type可以为如下几类:

  • FilterType.ANNOTATION:按照注解
  • FilterType.ASSIGNABLE_TYPE:按照给定的类型;比如按BookService类型
  • FilterType.ASPECTJ:使用ASPECTJ表达式
  • FilterType.REGEX:使用正则指定
  • FilterType.CUSTOM:使用自定义规则,自已写类,实现TypeFilter接口

注意到可以使用自定义规则,这个情况下需要自己编写FilterType类,并且重写match函数,在这个函数中定义匹配规则。

public class JamesTypeFilter implements TypeFilter{

    /*
     * MetadataReader:读取到当前正在扫描类的信息
     * MetadataReaderFactory:可以获取到其他任何类信息
     */
    @Override
    public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory)
            throws IOException {
        //获取当前类注解的信息
        AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();
        //获取当前正在扫描的类信息
        ClassMetadata classMetadata = metadataReader.getClassMetadata();
        //获取当前类资源(类的路径)
        Resource resource = metadataReader.getResource();
        
        String className = classMetadata.getClassName();
        System.out.println("----->"+className);
        if(className.contains("Service")){//当类包含er字符, 则匹配成功,返回true
            return true;
        }
        return false;
    }
}

使用时,指定type为CUSTOM,并且设置class类型为自定义的Filter类。

@ComponentScan(value="com.enjoy.cap2",includeFilters={
        @Filter(type=FilterType.CUSTOM,classes=         {JamesTypeFilters.class}
)},
useDefaultFilters=false) 
public class Cap2MainConfig2 {}

本文由『后端精进之路』原创,首发于博客 http://teckee.github.io/ , 转载请注明出处

搜索『后端精进之路』关注公众号,立刻获取最新文章和 价值2000元的BATJ精品面试课程

Spring MVC系列-(2) Bean的装配


以上所述就是小编给大家介绍的《Spring MVC系列-(2) Bean的装配》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Pro CSS Techniques

Pro CSS Techniques

Jeff Croft、Ian Lloyd、Dan Rubin / Apress / 2009-5-4 / GBP 31.49

Web Standards Creativity: Innovations in Web Design with CSS, DOM Scripting, and XHTML一起来看看 《Pro CSS Techniques》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具