二、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 的值如下图