Bean的裝配能夠理解爲依賴關係注入,Bean的裝配方式即Bean依賴注入的方式。Spring容器支持多種形式的Bean的裝配方式,如基於XML的裝配、基於註解(Annotation)的裝配和自動裝配(其中最經常使用的是基於註解的裝配),本文章將主要講解着三種裝配方式的使用。java
條件:①Bean類必須有一個無參構造方法;②Bean類必須爲屬性提供setter方法。spring
在配置文件中,使用元素來爲每一個屬性注入值bash
條件:Bean類必須提供有參構造方法app
在配置文件中,使用元素來爲參數注入值ide
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(註解)技術的全面支持。ui
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();
}
}
複製代碼
運行效果。this
所謂自動裝配,就是將一個Bean自動的注入到到其餘Bean的Property中。 Spring的元素中包含一個autowire屬性,咱們能夠經過設置autowire的屬性值來自動裝配Bean。autowire屬性有5個值,其值及說明下表所示: spa
這裏只須要在基於註解的裝配配置文件(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 />-->
<!--<!–分別定義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的三種裝配方式,其中咱們須要重點掌握第二種基於註解的裝配,它是咱們平常工做最經常使用的一種裝配。