JavaEE——Spring框架(Spring中的Bean)

二、JavaEE——Spring框架(Spring中的Bean)

1. Bean的配置

1.1 什么是Spring中的bean

bean的本质就是Java中的一个类,Spring中的bean就是Spring对该类的引用,来创建bean对象,可以将Spring比作工厂,bean就是该工厂生产的产品。

1.2 配置文件

Spring支持的两种格式的配置文件:properties文件和XML文件(较为常用)

XML配置文件的根元素是,其中包含多个子元素,每个子元素定义了一个bean

元素的常用属性:
id:bean的唯一标识符,用于指定bean的名称
name:用于指定bean的别名,可以多个(用逗号或分号 隔开)
class:用于指定bean的具体实现类,必须是全限定类目
scope:用于指定bean的模式(singleton、prototype、request、session、global等)*

2. Bean的实例化

实例化Bean的三种方式:构造器实例化、静态工厂方式实例化和实例工厂方式实例化。

2.1 构造器实例化

public class Bean_1 {

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

public class BeanTest_1 {

	public static void main(String[] args) {
		String xmlPath = "ee/bean/applicationContext.xml";
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
		Bean_1 bean1 = (Bean_1) applicationContext.getBean("bean1");
		System.out.println(bean1);
	}
}
<?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">
    
    <bean id="bean1" class="ee.bean.Bean_1"></bean>
</beans>

2.2 静态工厂方式实例化

public class Bean_2 {

}
public class MyBean_2Factory {
	public static Bean_2 createBean() {
		return new Bean_2();
	}
}
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class BeanTest_2 {

	public static void main(String[] args) {
		String xmlPath = "ee/bean/applicationContext.xml";
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
		System.out.println(applicationContext.getBean("bean2"));
	}

}
<?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">
       
    <!-- 
    	Bean_2 bean2 = MyBean_2Factory.createrBean();
    	factory-method:静态方法名
     -->
    <bean id="bean2" class="ee.bean.MyBean_2Factory" factory-method="createBean"></bean>
</beans>

2.3 实例工厂方式实例化

public class Bean_3 {

}
public class MyBean_3Factory {
	public Bean_3 createBean() {
		return new Bean_3();
	}
}
``

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

public class BeanTest_3 {

	public static void main(String[] args) {
		String xmlPath = "ee/bean/applicationContext.xml";
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
		System.out.println(applicationContext.getBean("bean3"));
	}

}
<?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">
    
    <!-- 
    	创建工厂实例
    	MyBean_3Factory myBean_3Factory = new MyBean_3Factory();
    	Bean_3 bean3 = myBean_3Factory.createBean();
    	factory-bean:工厂实例
    	factory-method:工厂类的普通方法
    	
     -->
    <bean id="myBean_3Factory" class="ee.bean.MyBean_3Factory"></bean>
    <bean id="bean3" factory-bean="myBean_3Factory" factory-method="createBean"></bean>
</beans>

3. Bean的作用域

在这里插入图片描述

4. Bean的生命周期

在这里插入图片描述

5. Bean的装配方式

Bean的装配可以理解为依赖注入,Bean的装配方式有:手动装配(基于XML装配、基于注解装配)和自动装配。
基于XML装配的方式:构造注入(构造方法)、设值注入(setter方法)

5.1 基于XML

5.1.1 目标类

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.username = username;
		this.password = password;
		this.list = list;
	}
	/**
	 * 使用设值注入 
	 * 提供默认无参构造方法
	 * 提供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 + "]";
	}
}

5.1.2 测试类

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

public class XmlBeanTest {
	public static void main(String[] args) {
		String xmlPath = "ee/bean_xml/applicationContext.xml";
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext(xmlPath);
		// 构造方法
		System.out.println(applicationContext.getBean("user1"));
		// setter方法
		System.out.println(applicationContext.getBean("user2"));
	}
}

5.1.3 配置文件

<?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">
 	
 	<!-- 构造方法注入
 			<constructor-arg> 用于配置构造方法
 				name:参数的名称
 				index:参数的索引号
 				value:参数的值
 				ref:引用数据,一般是另一个bean的id
 	 -->
 	<bean id="user1" class="ee.bean_xml.User">
 		<constructor-arg name="username" value="Tom" />
		<constructor-arg index="1" value="123456" />
		<constructor-arg index="2">
			<list>
				<value>"constructorvalue1"</value>
				<value>"constructorvalue2"</value>
			</list>
		</constructor-arg>
 	</bean>
 	<!-- setter方法注入-->
 	<bean id="user2" class="ee.bean_xml.User">
 		<property name="username" value="Jack"></property>
		<property name="password" value="112233"></property>
		<!-- 注入list集合 -->
		<property name="list">
			<list>
				<value>"setlistvalue1"</value>
				<value>"setlistvalue2"</value>
			</list>
		</property>
 	</bean>
</beans>

5.2 基于注解

5.2.1 主要注解

5.2.1.1 @Component:用于描述Spring中的Bean

@Component 相当于 <bean class = ">
@Component(“id”)相当于 <bean id = " class = “”>

5.2.1.2 @Component注解的衍生注解(功能一样)

@Repository:用于将数据访问层(DAO)的类标识为Spring中的Bean
@Service:用于将业务层(Service)的类标识为Spring中的Bean
@Controller:用于将控制层(Controller)的类标识为Spring中的Bean

5.2.1.3 依赖注入

@Autowired:用于对Bean的属性变量、属性的setter方法及构造方法进行标注
@Resource(“name”):,作用与@Autowired一样,按照名称注入
@Qualifier(“name”):配合@Autowired使用,按照名称注入

5.2.2 例子

5.2.2.1 Dao 层

public interface UserDao {
    public void save();
}
import org.springframework.stereotype.Repository;

@Repository("userDao") 
public class UserDaoImpl implements UserDao{
   public void save(){
	  System.out.println("userdao_____save_____");
   }
}

5.2.2.2 Service 层

public interface UserService {
	public void save();
}
import javax.annotation.Resource;
import org.springframework.stereotype.Service;

@Service("userService") 
public class UserServiceImpl implements UserService{
	//注入userDao实例
	@Resource(name="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;
	}
}

5.2.2.3 Controller 层

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

@Controller("userController")
public class UserController {
	
	//注入userService实例
	@Resource(name="userService")
	private UserService userService;
	public void save(){
		this.userService.save();
		System.out.println("userController____save____");
	}
	
	public void setUserService(UserService userService) {
		this.userService = userService;
	}
}

5.2.2.4 测试类

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

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

5.2.2.5 配置文件

<?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 命名空间 ,在配置文件中开启相应的注解处理器 -->
	<!--分别定义3个Bean实例  -->
	<!--     
		<context:annotation-config />  
		<bean id="userDao" class="ee.bean_annotation.UserDaoImpl" />
      	<bean id="userService" class="ee.bean_annotation.UserServiceImpl" />
      	<bean id="userController" class="ee.bean_annotation.UserController" /> 
     -->
	
	<!--使用 context 命名空间 ,通知Spring扫描指定包下所有的Bean类,进行注解解析-->   
    <context:component-scan base-package="ee.bean_annotation" />
</beans>

5.3 自动装配

自动装配就是将一个Bean自动注入到其它Bean的Factory中,通过设置< bean >中的 autowire 属性的值来自动装配Bean。autowire 的值如下图
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值