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<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 提供默认空参构造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<String> 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

<!-- 使用构造方式装配User实例 -->
	<bean id="user1" class="com.itheima.assemble.User">
		<constructor-arg index ="0" value="tom"/>
		<constructor-arg index ="1" value="123456"/>
		<constructor-arg index ="2">
			<list>
				<value>"constructorvalue1"</value>
				<value>"constructorvalue2"</value>
			</list>
		</constructor-arg>
	</bean>
	
	<!-- 2.使用设值注入方式装配User实例 -->
	<bean id="user2" class="com.itheima.assemble.User">
		<property name="username" value="张三"></property>
		<property name="password" value="654321"></property>
		<!-- 注入list集合 -->
		<property name="list">
			<list>
				<value>"setlistvalue1"</value>
				<value>"setlistvalue2"</value>
			</list>
		</property>
	</bean>

二、基于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

    <!-- 1.1使用context命名空间,在配置文件中开启相应的注解器 -->
    <context:annotation-config/>
	<!-- 1.2分配定义了3个bean容器 -->
	<bean id="userDao" class="com.itheima.annotation.UserDaoImpl"/>
	<bean id="userService" class="com.itheima.annotation.UserServiceImpl"/>
	<bean id="userController" class="com.itheima.annotation.UserController"/>
	
	<!-- 2.方法二: -->
	<!-- 2.1使用context命名空间,通知Spring扫描指定包下所有Bean类,进行注解解析 -->
	<context:component-scan base-package="com.itheima.annotation"/>

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

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

<bean id="userDao" class="com.itheima.annotation.UserDaoImpl"/>
	<bean id="userService" class="com.itheima.annotation.UserServiceImpl" autowire="byName"/>
	<bean id="userController" class="com.itheima.annotation.UserController" autowire="byName"/>
  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值