Spring Bean的三种装配方式

一、基于XML的装配
基于XML的装配,Spring提供了两种装配方式:设值注入(Setter Injection)和构造注入(Constructor Injection)。
设值注入要求Bean必须满足一下要求:
(1)Bean类必须提供一个默认的无参构造方法;
(2)Bean类必须为需要注入的属性提供对应的setter方法;
设值注入时,需要Spring在配置文件中,需要使用元素的子元素来为每个属性注入值;
使用构造方法时,在配置文件里,需要使用元素的子元素来定义构造方法的参数,可以使用value属性(或者子元素)来设值该参数的值。
User.java

package com.itheima.assemble;

import java.util.List;

public class User {
	private String username;
	private Integer password;
	private List list;
	
	/**
	 *  1.使用构造注入
	 *  1.1提供带所有参数的有参构造方法
	 */
	public User(String username, Integer password, List list) {
		super();
		this.username = username;
		this.password = password;
		this.list = list;
	}
	
	/**
	 *  2.使用设值注入
	 *  2.1 提供默认空参构造fangfa
	 *  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 list) {
		this.list = list;
	}

	@Override
	public String toString() {
		return "User [username=" + username + ", password=" + password + ", list=" + list + ", toString()="
				+ super.toString() + "]";
	}
	
}

XmlBeanAssembleTest.java

package com.itheima.assemble;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class XmlBeanAssembleTest {
	public static void main(String[] args) {
		/*定义配置文件路径*/
		String xmlPath ="com/itheima/assemble/beans5.xml";
		/*加载配置文件*/
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
		/*构造方式输出结果*/
		System.out.println(applicationContext.getBean("user1"));
		/*设置方式输出结果*/
		System.out.println(applicationContext.getBean("user2"));
	}
}

beans5.xml


	
		
		
		
			
				"constructorvalue1"
				"constructorvalue2"
			
		
	
	
	
	
		
		
		
		
			
				"setlistvalue1"
				"setlistvalue2"
			
		
	

二、基于Annotation的装配
在实际应用中如果有很多Bean时,还通过使用XML配置会导致臃肿,给后续的维护和升级带来一定的困难。Spring提供了对Annotation注解技术的全面支持,可以解决此困难。
Spring常用注解如下:

Component 描述Spring中的Bean,但是它时一个泛化的概念,仅仅表示一个组件(Bean)并且可以作用在任何层次;
Repository 用于将数据访问层(DAO)层的类标识为Spring中的Bean
Service 作用在业务层(service层),用于将业务层的类标识为Spring中的Bean
Controller 作用在控制层(如Spring MVC 的 controller层),用于将控制层的类标识为Spring中的Bean
Autowired 用于对Bean的属性变量、属性setter方法及构造方法进行标注,配合对应的注解处理器完成Bean的自动配置工作
Resourse 作用与Autowired一样。Resourse两个重要的属性:name和type。Spring将name解析为Bean实例名称,type解析为Bean实例类型

示例代码如下:
UserDao.java

package com.itheima.annotation;

public interface UserDao {
	public void save();
}

UserDaoImpl.java

package com.itheima.annotation;

import org.springframework.stereotype.Repository;

@Repository("userDao")
public class UserDaoImpl implements UserDao{

	@Override
	public void save() {
		System.out.println("userdao...save...");
	}

}

UserService .java

package com.itheima.annotation;

public interface UserService {
	public void save();
}

UserServiceImpl.java

package com.itheima.annotation;
import javax.annotation.Resource;
import javax.swing.Spring;
import org.springframework.stereotype.Service;

@Service("userService")
public class UserServiceImpl implements UserService {
	
	@Resource(name="userDao")
	private UserDao userDao;

	/*Spring Bean的自动装配方式,需要在Controller和ServiceImpl增加setter方法, 即如下代码*/
	public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}

	public void save() {
		/*调用userDao中的save方法*/
		this.userDao.save();
		System.out.println("userservice...save...");
	}

}

UserController.java

package com.itheima.annotation;

import javax.annotation.Resource;
import org.springframework.stereotype.Controller;

@Controller("userController")
public class UserController {
	@Resource(name="userService")
	private UserService userService;
	
	/*Spring Bean的自动装配方式,需要在Controller和ServiceImpl增加setter方法, 即如下代码*/
	public void setUserService(UserService userService) {
		this.userService = userService;
	}

	public void save() {
		this.userService.save();
		System.out.println("userController...save...");
	}
	
}

AnnotationAssemTest.java

package com.itheima.annotation;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class AnnotationAssemTest {
	public static void main(String[] args) {
		/*定义配置文件路径*/
		String xmlPath = "com/itheima/annotation/beans6.xml";
		/*加载配饰文件*/
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
		/*获取UserController实例*/
		UserController userController = (UserController) applicationContext.getBean("userController");
		/*调用UserController中的save()方法*/
		userController.save();
	}
}

beans6.xml

    
    
	
	
	
	
	
	
	
	

使用此时一定要添加包 Spring-aop-4.3.6.RELEASE.jar,否则将会报错哦!!!

三、自动装配
自动装配,就是将一个bean自动地注入到其他Bean的property中。
仿造如上示例二代码,在ServiceImpl.java和UserController.java中加入属性的Setter方法。
beans6.xml文件改为如下


	
	

你可能感兴趣的:(Spring Bean的三种装配方式)