Spring 注入集合、依赖检查、自动组件扫描、过滤组件自动扫描、自动装配属性


这里写图片描述


参考:
http://blog.csdn.net/woshiwxw765/article/details/7603497
http://www.yiibai.com/spring/spring-auto-scanning-components.html

Spring 注入集合

下面例子向您展示Spring如何注入值到集合类型(List, Set, Map, and Properties)。 支持4个主要的集合类型:

List – <list/>
Set – <set/>
Map – <map/>
Properties – <props/>

使用EL表达式注入集合:http://www.yiibai.com/spring/spring-el-lists-maps-example.html

MyCollection.java

//package com.peng.collection;

import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

public class MyCollection {

    private List<Object> lists;
    private Set<Object> sets;
    private Map<Object, Object> maps;
    private Properties pros;
    //setter and getter 
    @Override
    public String toString() {
        return "MyCollection [lists=" + lists + ", sets=" + sets + ", maps=" + maps + ", pros=" + pros + "]";
    }   
}

Person.java

package com.peng.pc;
public class Person {

    private String name;
    private String address;
    private int age;

    //setter and getter
    @Override
    public String toString() {
        return "Person [name=" + name + ", address=" + address + ", age=" + age + "]";
    }
}

Bean.xml

bean 配置文件

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


    <bean id="MyCollectionBean" class="com.peng.collection.MyCollection">
        <!-- java.util.List -->
        <property name="lists" >
            <list>
                <value>1</value><!-- 第一个list数据 -->
                <ref bean="PersonBean"/><!-- 第二个list数据 -->
                <bean class="com.peng.pc.Person"><!-- 第三个list数据 -->
                    <property name="name" value="list哈罗" />
                    <property name="address" value="list罗马" />
                    <property name="age" value="29" />
                </bean>
            </list>
        </property> 

        <!-- java.util.Set -->
        <property name="sets">
            <set>
                <value>1</value>
                <ref bean="PersonBean" />
                <bean class="com.peng.pc.Person">
                    <property name="name" value="set哈罗" />
                    <property name="address" value="set罗马" />
                    <property name="age" value="29" />
                </bean>
            </set>
        </property>

        <!-- java.util.Map -->
        <property name="maps">
            <map>
                <entry key="Key 1" value="1" />
                <entry key="Key 2" value-ref="PersonBean" />
                <entry key="Key 3">
                    <bean class="com.peng.pc.Person">
                        <property name="name" value="map简单" />
                        <property name="address" value="map越南" />
                        <property name="age" value="30" />
                    </bean>
                </entry>
            </map>
        </property>

        <!-- java.util.Properties -->
        <property name="pros">
            <props>
                <prop key="admin">admin@peng.com</prop>
                <prop key="support">support@peng.com</prop>
            </props>
        </property>

    </bean>
    <bean id="PersonBean" class="com.peng.pc.Person">
        <property name="name" value="哈罗" />
        <property name="address" value="罗马" />
        <property name="age" value="28" />
    </bean>
</beans>

TestMyCollection.java

package com.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.peng.collection.MyCollection;

public class TestMyCollection {
      public static void main( String[] args )
        {
            ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
            MyCollection mycollection = (MyCollection)context.getBean("MyCollectionBean");
            System.out.println(mycollection);

        }
}

输出结果:

MyCollection [lists=[1, Person [name=哈罗, address=罗马, age=28], Person [name=list哈罗, address=list罗马, age=29]], sets=[1, Person [name=哈罗, address=罗马, age=28], Person [name=set哈罗, address=set罗马, age=29]], maps={Key 1=1, Key 2=Person [name=哈罗, address=罗马, age=28], Key 3=Person [name=map简单, address=map越南, age=30]}, pros={admin=admin@peng.com, support=support@peng.com}]

依赖检查模式

定义了类的属性,判断是否赋值


public class Customer {
    private Person person;
    private int type;
    private String action;

    //getter and setter methods
}
<bean id="CustomerBean" class="com.yiibai.common.Customer" dependency-check="simple" >
        <property name="action" value="buy" />//这里只给 action赋值了
    </bean>

4个依赖检查支持的模式:

 none – 没有依赖检查,这是默认的模式。

 simple – 如果基本类型(int, long,double…)和集合类型(map, list..)的任何属性都没有设置,UnsatisfiedDependencyException将被抛出。

 objects – 如果对象类型的任何属性都没有设置,UnsatisfiedDependencyException将被抛出。

 all – 如果任何类型的任何属性都没有被设置,UnsatisfiedDependencyException将被抛出。

注:默认模式是 none 

详细例子:http://www.yiibai.com/spring/spring-properties-dependency-checking.html

自动扫描组件

通常情况下,声明所有的Bean类或组件的XML bean配置文件,这样Spring容器可以检测并注册Bean类或组件。 其实,Spring是能够自动扫描,检测和预定义的项目包并实例化bean,不再有繁琐的Bean类声明在XML文件中。
AutoDao.java

package com.peng.autoscan;

import org.springframework.stereotype.Component;

@Component
public class AutoDao {

    @Override
    public String toString() {
        return "Hello , This is AutoDao";
    }   
}

AutoService.java

package com.peng.autoscan.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

import com.peng.autoscan.AutoDao;
@Service("AAA")//自定义名称
@Component
public class AutoService {
    @Autowired//自动装配
    private AutoDao autoDao;

    public void setAutoDao(AutoDao autoDao) {
        this.autoDao = autoDao;
    }

    @Override
    public String toString() {
        return "AutoService [autoDao=" + autoDao + "]";
    }   
}

auto.xml

bean配置文件

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

    <context:component-scan base-package="com.peng.autoscan"></context:component-scan>
</beans>

TestAutoScanning.java

执行类

package com.test;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.peng.autoscan.service.AutoService;
/**
 * 测试自动组件扫描,变量要@Autowired 
 * @author Peng
 * @Date2016年11月23日下午4:51:09
 */
public class TestAutoScanning {
    public static void main(String[] args) {
        ApplicationContext context = 
                new ClassPathXmlApplicationContext("auto.xml");
        AutoService au = (AutoService) context.getBean("AAA");//使用了自定义名称@Service
        System.out.println(au);

    }
}

执行结果:

AutoService [autoDao=Hello , This is AutoDao]

自动扫描注释类型

在Spring2.5中,有4种类型的组件自动扫描注释类型

@Component – 指示自动扫描组件。
@Repository – 表示在持久层DAO组件。
@Service – 表示在业务层服务组件。
@Controller – 表示在表示层控制器组件。

所有的 @Repository, @Service 或 @Controller 被注解为 @Component。因此,我们可以只使用 @Component 对所有组件进行自动扫描?是的,Spring会自动扫描所有组件的 @Component 注解。

它工作正常,但不是一个好的做法,为便于阅读,应该始终声明@Repository,@ Service 或 @Controller 在指定的层,使你的代码更易于阅读

过滤组件自动扫描

过滤组件 - 包含

用Spring “过滤” 扫描并注册匹配定义“regex”,即使该类组件的名称未标注 @Component 。

AutoDao.java

package com.peng.autoscan;

public class AutoDao {

    @Override
    public String toString() {
        return "Hello , This is AutoDao";
    }   
}

AutoService.java

package com.peng.autoscan.service;

import org.springframework.beans.factory.annotation.Autowired;

import com.peng.autoscan.AutoDao;
public class AutoService {
    @Autowired//自动加载
    private AutoDao autoDao;

    @Override
    public String toString() {
        return "AutoService [autoDao=" + autoDao + "]";
    }   
}

auto.xml

"><beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">

    <!-- <context:component-scan base-package="com.peng.autoscan"></context:component-scan> -->
    <context:component-scan base-package="com.peng" >

        <context:include-filter type="regex" 
                       expression="com.peng.autoscan.*Dao.*" />

        <context:include-filter type="regex" 
                       expression="com.peng.autoscan.service.*Service.*" />

    </context:component-scan>
</beans>

没有了自定义名称,只能用首字母小写的形式。

AutoService au = (AutoService) context.getBean("autoService");

过滤组件 - 不包含

另外,您还可以排除指定组件,以避免 Spring 检测和 Spring 容器注册。不包括在这些文件中标注有 @Service 。

    <context:component-scan base-package="com.peng" >
        <context:exclude-filter type="annotation" 
            expression="org.springframework.stereotype.Service" />      
    </context:component-scan>

不包括那些包含Dao这个词组文件名。

    <context:component-scan base-package="com.peng" >
        <context:exclude-filter type="regex" 
            expression="com.peng.autoscan.*Dao.*" />        
    </context:component-scan>

自动装配属性

    @Autowired//自动装配
    private AutoDao autoDao;

就是自动装配,如果不装配,就为null。也可以使用@Resource来装配

    @Resource//自动装配
    private AutoDao autoDao;

这两个注解的区别是:

@Autowired 默认按类型装配,@Resource默认按名称装配,当找不到与名称匹配的bean才会按类型装配。
建议使用@Resource

使用@Autowired需要在xml文件中配置信息

第一种方式(只能用@Autowired,因为你引入的包就是 org…AutowiredAnnotatio…,不能用@Resource)

<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 class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" />
</beans>

第二种方式(@Resource和@Autowired,都可以使用):

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-4.3.xsd">

<context:annotation-config></context:annotation-config> 

另外@Resource可以用来标注在字段或属性的setter方法上.如果标注在字段上,则可以省略掉该属性的getter 和setter方法。

上个例子的中的 autoDao 的setter 方法可以省略(如果你在手动在xml文件中配置,则不行,必须是自动扫描的前提下)

public void setAutoDao(AutoDao autoDao) {
        this.autoDao = autoDao;
    }

@Autowired装配实例

默认情况下,@Autowired将执行相关检查,以确保属性已经装配正常。当Spring无法找到匹配的Bean装配,它会抛出异常。要解决这个问题,可以通过 @Autowired 的“required”属性设置为false来禁用此检查功能。

如果bean配置文件有两个类型相同的对象,如 personA,personB,可以通过设置 @Qualifier 自动装配一个特定的 bean

public class Customer {
    //按类型装配
    @Autowired(required=false)//禁用此检查功能,找不到不会b报错
    @Qualifier("personA")
    private Person person;
    private int type;
    private String action;
    //setter and getter 
    //toString..
}
public class Person {
    private String name;
    //setter and getter 
    //toString..
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-2.5.xsd">
    <!-- // by www.yiibai.com -->
    <!-- <bean
        class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" />
 -->
 <context:annotation-config></context:annotation-config>

    <bean id="customer" class="com.yiibai.common.Customer">
        <property name="action" value="buy" />
        <property name="type" value="1" />
    </bean>

    <bean id="personA" class="com.yiibai.common.Person">
        <property name="name" value="YiibaiA" />

    </bean>
    <bean id="personB" class="com.yiibai.common.Person">
        <property name="name" value="YiibaiB" />
    </bean>

</beans>

执行类

ApplicationContext context = new ClassPathXmlApplicationContext(
                "applicationContext.xml");

        Customer cust = (Customer) context.getBean("customer");
        System.out.println(cust);

执行结果:

Customer [person=Person [name=YiibaiA], type=1, action=buy]

更多实例http://www.yiibai.com/spring/spring-auto-wiring-beans-with-autowired-annotation.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值