Bean的装配可以理解为依赖关系注入,Bean的装配方式即Bean依赖注入的方式。Spring容器支持多种形式的Bean的装配方式,如 基于XML的装配、基于注解(Annotation)的装配和自动装配(其中最常用的是基于注解的装配) ,本文章将主要讲解着三种装配方式的使用。
条件:①Bean类必须有一个无参构造方法;②Bean类必须为属性提供setter方法。
在配置文件中,使用元素来为每个属性注入值
条件:Bean类必须提供有参构造方法
在配置文件中,使用元素来为参数注入值
package com.ssm.assemble; import java.util.List; public class User { private String username; private Integer password; private List<String> list; /** * 1.使用构造注入 * 1.1提供带所有参数的有参构造方法。 */ public User(String username, Integer password, List<String> list) { super(); this.username = username; this.password = password; this.list = list; } /** * 2.使用设值注入 * 2.1提供默认空参构造方法 ; * 2.2为所有属性提供setter方法。 */ public User() { super(); } public void setUsername(String username) { this.username = username; } public void setPassword(Integer password) { this.password = password; } public void setList(List<String> list) { this.list = list; } @Override public String toString() { return "User [username=" + username + ", password=" + password + ", list=" + list + "]"; } } 复制代码
<?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-4.3.xsd"> <!--1.使用构造注入方式装配User实例 --> <bean id="user1" class="com.ssm.assemble.User"> <constructor-arg index="0" value="小红" /> <constructor-arg index="1" value="987654" /> <constructor-arg index="2"> <list> <value>"constructorvalue1"</value> <value>"constructorvalue2"</value> </list> </constructor-arg> </bean> <!--2.使用设值注入方式装配User实例 --> <bean id="user2" class="com.ssm.assemble.User"> <property name="username" value="小明"></property> <property name="password" value="123456"></property> <!-- 注入list集合 --> <property name="list"> <list> <value>"setlistvalue1"</value> <value>"setlistvalue2"</value> </list> </property> </bean> </beans> 复制代码
package com.ssm.assemble; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class XmlBeanAssembleTest { public static void main(String[] args) { // 定义配置文件路径 String xmlPath = "beans1.xml"; // 加载配置文件 ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath); // 构造方式输出结果 System.out.println(applicationContext.getBean("user1")); // 设值方式输出结果 System.out.println(applicationContext.getBean("user2")); } } 复制代码
运行效果。
由于基于XML的装配可能会导致XML配置文件过于臃肿,给后续的维护和升级带来一定的困难。因此,Spring提供了对Annotation(注解)技术的全面支持。
package com.ssm.annotation; public interface UserDao { public void save(); } 复制代码
package com.ssm.annotation; import org.springframework.stereotype.Repository; @Repository("userDao") //@Repository("userDao")相当于配置文件中的:<bean id="userDao" class="com.ssm.annotation.UserDaoImpl" /> public class UserDaoImpl implements UserDao{ @Override public void save() { System.out.println("userdao...save..."); } } 复制代码
package com.ssm.annotation; public interface UserService { public void save(); } 复制代码
package com.ssm.annotation; import javax.annotation.Resource; import org.springframework.stereotype.Service; @Service("userService") //相当于配置文件中的:<bean id="userService" class="com.ssm.annotation.UserServiceImpl" /> public class UserServiceImpl implements UserService{ @Resource(name="userDao") //当于配置文件中的:<property name="userDao" ref="userDao"/> private UserDao userDao; public void save() { //调用userDao中的save方法 this.userDao.save(); System.out.println("userservice....save..."); } public void setUserDao(UserDao userDao) { this.userDao = userDao; } } 复制代码
package com.ssm.annotation; import javax.annotation.Resource; import org.springframework.stereotype.Controller; @Controller("userController") //相当于配置文件中的:<bean id="userController" class="com.ssm.annotation.UserController" /> public class UserController { @Resource(name="userService") //当于配置文件中的:<property name="userService" ref="userService"/> private UserService userService; public void save(){ this.userService.save(); System.out.println("userController...save..."); } public void setUserService(UserService userService) { this.userService = userService; } } 复制代码
<?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-4.3.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd"> <!-- 使用 context 命名空间 ,在配置文件中开启相应的注解处理器 --> <context:annotation-config /> <!--分别定义3个Bean实例 --> <bean id="userDao" class="com.ssm.annotation.UserDaoImpl" /> <bean id="userService" class="com.ssm.annotation.UserServiceImpl" /> <bean id="userController" class="com.ssm.annotation.UserController" /> <!--使用 context 命名空间 ,通知Spring扫描指定包下所有Bean类,进行注解解析--> <context:component-scan base-package="com.ssm.annotation" /> </beans> 复制代码
package com.ssm.annotation; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class AnnotationAssembleTest { public static void main(String[] args) { // 定义配置文件路径 String xmlPath = "beans2.xml"; // 加载配置文件 ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath); // 获取UserController实例 UserController userController = (UserController) applicationContext.getBean("userController"); // 调用UserController中的save()方法 userController.save(); } } 复制代码
运行效果。
所谓自动装配,就是将一个Bean自动的注入到到其他Bean的Property中。 Spring的元素中包含一个autowire属性,我们可以通过设置autowire的属性值来自动装配Bean。autowire属性有5个值,其值及说明下表所示:
这里只需要在基于注解的装配配置文件(beans.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" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd"> <!-- 使用 context 命名空间 ,在配置文件中开启相应的注解处理器 --> <!--<context:annotation-config />--> <!--<!–分别定义3个Bean实例 –>--> <!--<bean id="userDao" class="com.ssm.annotation.UserDaoImpl" />--> <!--<bean id="userService" class="com.ssm.annotation.UserServiceImpl" />--> <!--<bean id="userController" class="com.ssm.annotation.UserController" />--> <!--<!–使用 context 命名空间 ,通知Spring扫描指定包下所有Bean类,进行注解解析–>--> <!--<context:component-scan base-package="com.ssm.annotation" />--> <!-- 使用bean元素的autowire属性完成自动装配 --> <bean id="userDao" class="com.ssm.annotation.UserDaoImpl" /> <bean id="userService" class="com.ssm.annotation.UserServiceImpl" autowire="byName" /> <bean id="userController" class="com.ssm.annotation.UserController" autowire="byName"/> </beans> 复制代码
以上就是Spring中Bean的三种装配方式,其中我们需要重点掌握第二种基于注解的装配,它是我们日常工作最常用的一种装配。