Spring中Bean的装配方式

2,668

前言

       Bean的装配可以理解为依赖关系注入,Bean的装配方式即Bean依赖注入的方式。Spring容器支持多种形式的Bean的装配方式,如基于XML的装配、基于注解(Annotation)的装配和自动装配(其中最常用的是基于注解的装配),本文章将主要讲解着三种装配方式的使用。

基于XML的装配

方式一:设置注入

条件:①Bean类必须有一个无参构造方法;②Bean类必须为属性提供setter方法。

在配置文件中,使用元素来为每个属性注入值

方式二:构造注入

条件:Bean类必须提供有参构造方法

在配置文件中,使用元素来为参数注入值

具体实现步骤如下

  1. 创建Java类User,提供有参、无参构造方法以及属性setter方法;
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 + "]";
    }
}
  1. 创建Spring配置文件beans1.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"
       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>
  1. 创建测试类XmlBeanAssembleTest,测试程序;
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"));
    }
}
  1. 运行效果。

    image

基于注解的装配

  由于基于XML的装配可能会导致XML配置文件过于臃肿,给后续的维护和升级带来一定的困难。因此,Spring提供了对Annotation(注解)技术的全面支持。

image

具体实现步骤如下

  1. 创建数据访问(Dao)层接口UserDao;
package com.ssm.annotation;

public interface UserDao {
    public void save();
}
  1. 创建数据访问(UserDao)层接口的实现类UserDaoImpl,并且在实现类前添加对应的注解@Repository("userDao");
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...");
    }
}
  1. 创建业务(Service)层接口UserService;
package com.ssm.annotation;

public interface UserService {
    public void save();
}
  1. 创建业务(Service)层接口的实现类UserServiceImpl并添加属性对象UserDao的setter方法,并在实现类前添加对应的注解@Service("userService")和在类里面方法前添加对应的注解 @Resource(name="userDao");
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;
    }
}
  1. 创建控制(Controller)层Java类UserController,并在实现类前添加对应的注解@Controller("userController")和在类里面方法前添加对应的注解 @Resource(name="userService");
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;
    }
}
  1. 创建Spring配置文件beans2.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-4.3.xsd
      http://www.springframework.org/schema/context
  http://www.springframework.org/schema/context/spring-context-4.3.xsd">
  
    <!-- 使用 context 命名空间 ,在配置文件中开启相应的注解处理器 -->
    <context:annotation-config />
    <!--使用 context 命名空间 ,通知Spring扫描指定包下所有Bean类,进行注解解析-->
    <context:component-scan base-package="com.ssm.annotation" />
</beans>
  1. 创建测试类AnnotationAssembleTest,测试程序;
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();
    }
}
  1. 运行效果。

    image

自动装配

       所谓自动装配,就是将一个Bean自动的注入到到其他Bean的Property中。 Spring的元素中包含一个autowire属性,我们可以通过设置autowire的属性值来自动装配Bean。autowire属性有5个值,其值及说明下表所示:

image

具体实现步骤如下

这里只需要在基于注解的装配配置文件(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 />-->
   <!--&lt;!&ndash;分别定义3个Bean实例  &ndash;&gt;-->
   <!--<bean id="userDao" class="com.ssm.annotation.UserDaoImpl" />-->
   <!--<bean id="userService" class="com.ssm.annotation.UserServiceImpl" />-->
   <!--<bean id="userController" class="com.ssm.annotation.UserController" />-->
   <!--&lt;!&ndash;使用 context 命名空间 ,通知Spring扫描指定包下所有Bean类,进行注解解析&ndash;&gt;-->
   <!--<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的三种装配方式,其中我们需要重点掌握第二种基于注解的装配,它是我们日常工作最常用的一种装配。