Spring项目自动装配&集合注入

1. 自动配置

1.1 什么是依赖自动装配?

  • IoC容器根据bean所依赖的资源在容器中自动查找并注入到bean中的过程称为自动装配

1.2 自动装配方式有哪些?

  • 按类型(常用)
  • 按名称
  • 按构造方法
  • 不启用自动装配

1.3 准备下案例环境

  • 创建一个Maven项目
  • pom.xml添加依赖
  • resources下添加spring的配置文件

项目的结构如下:
在这里插入图片描述
(1)项目中添加UserDao、UserDaoImpl、UserService和UserServiceImpl类

public interface UserDao {
    public void select();
}
public class UserDaoImpl implements UserDao {

    private String userName;
    private Integer userAge;

    public void select() {
        System.out.println("UserDao select, running ......");
    }
}
public interface UserService {
    public void select();
}
public class UserServiceImpl implements UserService {

    private UserDao userDao;

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    public void select() {
        System.out.println("UserService select, running ......");
        userDao.select();
    }
}

(2)resources下提供spring的配置文件

<?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="userDao" class="com.dcxuexi.dao.impl.UserDaoImpl" />
    <bean id="userService" class="com.dcxuexi.service.impl.UserServiceImpl" >
        <property name="userDao" ref="userDao" />
    </bean>
</beans>

(3)编写AppForAutoware运行类,加载Spring的IOC容器,并从中获取对应的bean对象

public class SpringAnto {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserService userService = (UserService) context.getBean("userService");
        userService.select();
    }
}

1.4 完成自动装配的配置

接下来,在上面这个环境中来完成自动装配的学习:
自动装配只需要修改applicationContext.xml配置文件即可:
(1)将<property>标签删除
(2)在<bean>标签中添加autowire属性
首先来实现按照类型注入的配置

<?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 class="com.dcxuexi.dao.impl.UserDaoImpl" />
    <!--autowire属性:开启自动装配,通常使用按类型装配-->
    <bean id="userService" class="com.dcxuexi.service.impl.UserServiceImpl"  autowire="byType" />
    
</beans>

注意事项:

  • 需要注入属性的类中对应属性的setter方法不能省略
  • 被注入的对象必须要被Spring的IOC容器管理
  • 按照类型在Spring的IOC容器中如果找到多个对象,会报NoUniqueBeanDefinitionException

一个类型在IOC中有多个对象,还想要注入成功,这个时候就需要按照名称注入,配置方式为:

<?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 class="com.dcxuexi.dao.impl.UserDaoImpl" />
    <!--autowire属性:开启自动装配,通常使用按类型装配-->
    <bean id="userService" class="com.dcxuexi.service.impl.UserServiceImpl"  autowire="byName" />

</beans>

注意事项:

  • 按照名称注入中的名称指的是什么?
    在这里插入图片描述
    • userDao是private修饰的,外部类无法直接方法
    • 外部类只能通过属性的set方法进行访问
    • 对外部类来说,setUserDao方法名,去掉set后首字母小写是其属性名
      • 为什么是去掉set首字母小写?
      • 这个规则是set方法生成的默认规则,set方法的生成是把属性名首字母大写前面加set形成的方法名
    • 所以按照名称注入,其实是和对应的set方法有关,但是如果按照标准起名称,属性名和set对应的名是一致的
  • 如果按照名称去找对应的bean对象,找不到则注入Null
  • 当某一个类型在IOC容器中有多个对象,按照名称注入只找其指定名称对应的bean对象,不会报错

两种方式介绍完后,以后用的更多的是按照类型注入。
最后对于依赖注入,需要注意一些其他的配置特征:

  1. 自动装配用于引用类型依赖注入,不能对简单类型进行操作
  2. 使用按类型装配时(byType)必须保障容器中相同类型的bean唯一,推荐使用
  3. 使用按名称装配时(byName)必须保障容器中具有指定名称的bean,因变量名与配置耦合,不推荐使用
  4. 自动装配优先级低于setter注入与构造器注入,同时出现时自动装配配置失效

2. 集合注入

前面我们已经能完成引入数据类型和简单数据类型的注入,但是还有一种数据类型集合,集合中既可以装简单数据类型也可以装引用数据类型,对于集合,在Spring中该如何注入呢?
先来回顾下,常见的集合类型有哪些?

  • 数组
  • List
  • Set
  • Map
  • Properties

针对不同的集合类型,该如何实现注入呢?

2.1 环境准备

  • 创建一个Maven项目
  • pom.xml添加依赖
  • resources下添加spring的配置文件applicationContext.xml

项目的结构如下:
在这里插入图片描述
(1)项目中添加添加UserDao、UserDaoImpl类

public interface UserDao {
    public void select();
}
public class UserDaoImpl implements UserDao {

    private int[] array;
    private Set<String> set;
    private List<String> list;
    private Map<String,String> map;
    private Properties properties;

    public void setArray(int[] array) {
        this.array = array;
    }

    public void setSet(Set<String> set) {
        this.set = set;
    }

    public void setList(List<String> list) {
        this.list = list;
    }

    public void setMap(Map<String, String> map) {
        this.map = map;
    }

    public void setProperties(Properties properties) {
        this.properties = properties;
    }

    public void select() {
        System.out.println("UserDao select, running .....");
        System.out.println("array = " + Arrays.toString(array));
        System.out.println("set = " + set);
        System.out.println("list = " + list);
        System.out.println("map = " + map);
        System.out.println("properties = "+ properties);

    }
}

(2)resources下提供spring的配置文件,applicationContext.xml

<?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="userDao" class="com.dcxuexi.dao.impl.UserDaoImpl" />

</beans>

(3)编写SpringCollection运行类,加载Spring的IOC容器,并从中获取对应的bean对象

public class SpringCollection {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserDao userDao = (UserDao) context.getBean("userDao");
        userDao.select();
    }
}

接下来,在上面这个环境中来完成集合注入的学习:
下面的所以配置方式,都是在userDao的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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="userDao" class="com.dcxuexi.dao.impl.UserDaoImpl" >
        
    </bean>

</beans>

2.2 注入数组类型数据

        <property name="array">
            <array>
                <value>1</value>
                <value>2</value>
                <value>3</value>
            </array>
        </property>

2.3 注入List类型数据

        <property name="list">
            <list>
                <value>blue</value>
                <value>red</value>
                <value>green</value>
            </list>
        </property>

2.4 注入Set类型数据

        <property name="set">
            <set>
                <value>zhangsan</value>
                <value>lisi</value>
                <value>wangwu</value>
            </set>
        </property>

2.5 注入Map类型数据

        <property name="map">
            <map>
                <entry key="name" value="xiaochuang" />
                <entry key="age" value="20" />
                <entry key="address" value="shanghai" />
            </map>
        </property>

2.6 注入Properties类型数据

        <property name="properties">
            <props>
                <prop key="ip">192.168.1.110</prop>
                <prop key="port">18080</prop>
            </props>
        </property>

完整注入的配置

<?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="userDao" class="com.dcxuexi.dao.impl.UserDaoImpl" >
        <property name="array">
            <array>
                <value>1</value>
                <value>2</value>
                <value>3</value>
            </array>
        </property>
        <property name="set">
            <set>
                <value>zhangsan</value>
                <value>lisi</value>
                <value>wangwu</value>
            </set>
        </property>
        <property name="list">
            <list>
                <value>blue</value>
                <value>red</value>
                <value>green</value>
            </list>
        </property>
        <property name="map">
            <map>
                <entry key="name" value="xiaochuang" />
                <entry key="age" value="20" />
                <entry key="address" value="shanghai" />
            </map>
        </property>
        <property name="properties">
            <props>
                <prop key="ip">192.168.1.110</prop>
                <prop key="port">18080</prop>
            </props>
        </property>
    </bean>

</beans>

配置完成后,运行下看结果:
在这里插入图片描述
说明:

  • property标签表示setter方式注入,构造方式注入constructor-arg标签内部也可以写<array><list><set><map><props>标签
  • List的底层也是通过数组实现的,所以<list><array>标签是可以混用
  • 集合中要添加引用类型,只需要把<value>标签改成<ref>标签,这种方式用的比较少

项目代码

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Spring实现自动装配的方式有两个角度:组件扫描和自动装配。组件扫描是指Spring自动发现应用上下文中所创建的bean,而自动装配是指Spring自动满足bean之间的依赖关系,也就是IoC/DI。\[2\] 在Spring中,可以使用@Autowired注解来实现自动装配。通过@Autowired注解,可以将构造器、普通字段和具有参数的方法与相应的bean进行自动装配。默认情况下,所有使用@Autowired注解的属性都需要被设置,如果Spring找不到匹配的bean进行装配,会抛出异常。如果某个属性允许不被设置,可以设置@Autowired注解的required属性为false。当IOC容器中存在多个类型兼容的bean时,Spring会尝试匹配bean的id值是否与变量名相同,如果相同则进行装配,否则可以在@Qualifier注解中提供bean的名称来进行装配。@Autowired注解还可以应用在数组类型的属性和集合属性上,Spring自动装配所有匹配的bean。当@Autowired注解用在java.util.Map上时,Spring自动装配与值类型兼容的bean,并以bean的id值作为键。\[1\] 为了启用注解驱动的Bean定义和自动注入策略,需要在Spring配置文件中使用&lt;context:component-scan&gt;元素来启用类扫描机制。这样Spring容器就能够自动扫描并创建带有@Component注解的类,并自动装配它们之间的依赖关系。\[3\] #### 引用[.reference_title] - *1* [Spring自动装配](https://blog.csdn.net/chen13333336677/article/details/101424191)[target=&quot;_blank&quot; data-report-click={&quot;spm&quot;:&quot;1018.2226.3001.9630&quot;,&quot;extra&quot;:{&quot;utm_source&quot;:&quot;vip_chatgpt_common_search_pc_result&quot;,&quot;utm_medium&quot;:&quot;distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt&quot;}} ] [.reference_item] - *2* *3* [Spring自动装配](https://blog.csdn.net/qq_41512902/article/details/126140352)[target=&quot;_blank&quot; data-report-click={&quot;spm&quot;:&quot;1018.2226.3001.9630&quot;,&quot;extra&quot;:{&quot;utm_source&quot;:&quot;vip_chatgpt_common_search_pc_result&quot;,&quot;utm_medium&quot;:&quot;distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt&quot;}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.D.Chuang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值