Spring中Bean的裝配方式

前言

       Bean的裝配能夠理解爲依賴關係注入,Bean的裝配方式即Bean依賴注入的方式。Spring容器支持多種形式的Bean的裝配方式,如基於XML的裝配、基於註解(Annotation)的裝配和自動裝配(其中最經常使用的是基於註解的裝配),本文章將主要講解着三種裝配方式的使用。java

基於XML的裝配

方式一:設置注入

條件:①Bean類必須有一個無參構造方法;②Bean類必須爲屬性提供setter方法。spring

在配置文件中,使用元素來爲每一個屬性注入值bash

方式二:構造注入

條件:Bean類必須提供有參構造方法app

在配置文件中,使用元素來爲參數注入值ide

具體實現步驟以下

  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(註解)技術的全面支持。ui

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 />
    <!--分別定義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>
複製代碼
  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. 運行效果。this

    image

自動裝配

       所謂自動裝配,就是將一個Bean自動的注入到到其餘Bean的Property中。 Spring的元素中包含一個autowire屬性,咱們能夠經過設置autowire的屬性值來自動裝配Bean。autowire屬性有5個值,其值及說明下表所示: spa

image

具體實現步驟以下

這裏只須要在基於註解的裝配配置文件(beans.xml)中把註解方式換成自動裝配便可,具體代碼以下:code

<?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的三種裝配方式,其中咱們須要重點掌握第二種基於註解的裝配,它是咱們平常工做最經常使用的一種裝配。

相關文章
相關標籤/搜索