Spring Bean的装配

Bean的装配可以理解为依赖关系注入,Bean的装配方式即Bean依赖注入的方式

Bean的装配方式有3种,基于xml,基于注解Annotation,自动装配

1.基于xml装配

1.1设值注入
Spring实例化Bean的过程中,首先调用Bean的默认构造方法来实例化Bean,然后通过反射的方式调用setter方法来注入属性值。因此,设值注入要求Bean必须满足以下两点

Bean类必须提供一个默认的无参构造方法

Bean类必须为需要注入的属性提供对应的setter方法

设值注入在配置文件中使用<Bean>的子元素<property>来为每个属性注入值

1.2构造方法注入

Bean类需要提供一个带参构造方法

配置文件中使用的子元素来定义构造方法的参数。可以使用其属性来设置该参数的值

下面是基于xml装配的构造注入和设置注入例子

User.java

`package com.itheima.assemble;

import java.util.List;

public class User {

	private String username;
	private Integer password;
	private List<String> list;
	//用于构造注入
	public User(String username,Integer password,List<String>list) {
		super();
		this.list=list;
		this.password=password;
		this.username=username;
		
	}
	//用于设值注入
	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;
	}
	
	public String toString() {
		return "User [username="+username+",password="+password+",list="+list+"]";
		
	}
}`

bean.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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-4.3.xsd">
        
        <!-- 使用构造注入方式装配User实例 -->
        <!-- constructor-arg用于定义构造方法的参数,index表示构造方法的索引 -->
        <bean id="user1" class="com.itheima.assemble.User">
        <constructor-arg index="0" value="tom"></constructor-arg>
        <constructor-arg index="1" value="123456"></constructor-arg>
        
        <constructor-arg index="2">
        <list>
        <value>"constructorvalue1"</value>
        <value>"constructorvalue2"</value>
        </list>
        
        </constructor-arg>
        </bean>
        
        <!-- property用于调用setter方法 -->
        <bean id="user2" class="com.itheima.assemble.User">
        <property name="username" value="张三"></property>
        <property name="password" value="654321"></property>
        
        <property name="list">
        <list>
        <value>"setlistvalue1"</value>
        <value>"setlistvalue2"</value>
        </list>      
        </property>
   
        </bean>

2.基于注解的装配Annotation

@Component 可以使用此注解描述Spring中的Bean,但他是一个泛化的概念,仅仅表示一个组件(Bean) 可以作用在任何层
@Repository 功能与Component相同 Dao层 @Service
功能与Component相同 Service层 @Contorller
功能与Component相同 控制层

@Autowired
用于对Bean的属性变量,属性的setter方法及构造方法进行标注,配合对应的注解处理器完成Bean的自动配置工作,默认按照Bean的类型进行装配
@Resource 作用与Autowired一样,区别在于Resource默认按照Bean的实例名称进行装配

UserDao.java

package com.itheima.annotation;
public interface UserDao {
public void save();
}

UserDaoImpl.java

package com.itheima.annotation;

import org.springframework.stereotype.Repository;

//将UserDaoImpl类标识为Spring中的Bean,该写法相当于在配置文件中
//<Bean id="userDao" class="com.itheima.annnotation.UserDaoImpl"></Bean>
@Repository("userDao")
public class UserDaoImpl implements UserDao{
	@Override
	public void save() {
		// TODO Auto-generated method stub
		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 org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;

@Service("userService")
public class UserServiceImpl implements UserService {

	@Resource(name="userDao")//相当于<property name="userDao" ref="userDao"/>
	private UserDao userDao;

	public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}
	@Override
	public void save() {
		// TODO Auto-generated method stub
this.userDao.save();
System.out.println("userservice......save");
	}
}

bean6.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:annotation-config/> 
        分别定义3个Bean实例       
      <bean id="userDao" class="com.itheima.annotation.UserDaoImpl"></bean>  
       <bean id="userService" class="com.itheima.annotation.UserServiceImpl"></bean>
        <bean id="userController" class="com.itheima.annotation.UserController"></bean> -->
        
    <!-- 高效配置 通知spring扫描指定包下所有 Bean类,进行注解解析-->
	<!--  <context:component-scan base-package="com.itheima.annotation"></context:component-scan>  -->
   <!-- 自动装配 -->
   <bean id="userDao" class="com.itheima.annotation.UserDaoImpl"></bean> 
   <bean id="userService" class="com.itheima.annotation.UserServiceImpl" autowire="byName"></bean>
   <bean id="userController" class="com.itheima.annotation.UserController" autowire="byName"></bean>
   
</beans>

AnnotationAssembleTest.java 测试类

package com.itheima.annotation;

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

public class AnnotationAssembleTest {
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();
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值