文章目录
一、什么是bean
什么是bean?
spring相当于工厂,bean相当于工厂中的产品。而工厂(spring)负责产品(bean)的生产和管理。
tips:
Bean的本质就是Java中的类,而Spring中的Bean其实就是对实体类的引用,来生产Java类对象,从而实现生产和管理Bean 。
二、bean的配置
bean的配置方式有两种:
- xml方式进行配置
- property方式进行配置
三、bean的作用域
四、bean的生命周期
spring可以管理spring中部分作用域的生命周期。对于sington,prototype。情况如下:
具体的生命周期流程图如下:
五、bean的装配方式
Bean的装配可以理解为依赖关系注入,Bean的装配方式即Bean依赖注入的方式。Spring容器支持多种形式的Bean的装配方式,如基于XML的装配、基于注解(Annotation)的装配和自动装配(其中最常用的是基于注解的装配)
5.1 基于xml的装配
例子:
package com.fengli;
import com.fengli.beans.Bean1;
import com.fengli.beans.Bean2;
import com.fengli.beans.Bean3;
import com.fengli.beans.Bean4;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Main {
private static ApplicationContext context;
public static void main(String argc[]){
/**
* 构造器实例化,使用默认构造函数。
*/
context=new ClassPathXmlApplicationContext("SpringBeans.xml");
Bean1 bean1= (Bean1) context.getBean("bean1");
bean1.eatBean();
/**
* 使用静态工厂方式进行bean实例化
*/
Bean2 bean2= (Bean2) context.getBean("bean2");
bean2.bean2DoSomething();
/**
* 使用工厂方式进行bean
*/
Bean3 bean3= (Bean3) context.getBean("bean3");
bean3.bean3Want();
//基于xml的两种装配方式
Bean4 bean4= (Bean4) context.getBean("bean4");
Bean4 anoterBean4= (Bean4) context.getBean("anotherBean4");
bean4.bean4DoSomething();
anoterBean4.bean4DoSomething();
}
}
对应的SpringBeans.xml
<bean id="bean4" class="com.fengli.beans.Bean4">
<constructor-arg index="0" value="litte bean"></constructor-arg>
<constructor-arg index="1" value="2"></constructor-arg>
</bean>
<bean id="anotherBean4" class="com.fengli.beans.Bean4">
<property name="name" value="litte bean"></property>
<property name="count" value="40"></property>
</bean>
5.2 基于annotation的装配
基于XML的装配可能会导致XML配置文件过于臃肿,给后续的维护和升级带来一定的困难。Spring提供了对注解的支持
例子:
目录结构:
UserDaoImp.java
@Repository("userDao")
public class UserDaoImp implements UserDao {
public void doSomething() {
System.out.println("userDaoImp doSomething");
}
}
Service1.java
@Service("service1")
public class Service1 {
@Resource(name = "userDao")
private UserDao userDao;
public void firstService(){
userDao.doSomething();
}
/* public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}*/
}
Controller1.java
@Controller("controller1")
public class Controller1 {
@Resource(name = "service1")
private Service1 service1;
public void A(){
service1.firstService();
}
/* public void setService1(Service1 service1) {
this.service1 = service1;
}*/
}
对应的配置:
<!-- 使用这个标签的作用是省略使用Resource等注解时,用传统方式需要在spring配置文件中添加相应的bean -->
<context:annotation-config></context:annotation-config>
<bean id="userDao" class="com.fengli.daoImp.UserDaoImp"></bean>
<bean id="service1" class="com.fengli.services.Service1" ></bean>
<bean id="controller1" class="com.fengli.controllers.Controller1" ></bean>
tips:对于 <context:annotation-config></context:annotation-config>,参考链接:https://my.oschina.net/wangdaoliang/blog/789478
main方法
//用于测试基于xml、注解、自动装配方式装配bean
Controller1 controller1= (Controller1) context.getBean("controller1");
controller1.A();
运行结果:
5.3 自动装配方式装配bean
使用这个方法需要记住的要点:
- 对相应的class写setter方法
- 在bean的的配置中需要指定autowire的依据
对于5.2中的代码,我们放开Controller1,UserDaoImpl 的setter方法。
在SpringBeans.xml:
<context:annotation-config></context:annotation-config>
<bean id="userDao" class="com.fengli.daoImp.UserDaoImp"></bean>
<bean id="service1" class="com.fengli.services.Service1" autowire="byName"></bean>
<bean id="controller1" class="com.fengli.controllers.Controller1" autowire="byName"></bean>
六、bean的实例化方式
实例化Bean有三种方式,分别为构造器实例化、静态工厂方式实例化和实例工厂方式实例化(其中最常用的是构造器实例化)。
目录结构:
SpringBeans.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.xsd">
<!-- 使用构造函数方式实例化bean -->
<bean id="bean1" class="com.fengli.beans.Bean1"></bean>
<!--使用静态工厂方式实例化bean -->
<bean id="bean2" class="com.fengli.beanFactorys.Bean2Factory" factory-method="getInstance"></bean>
<!--使用工厂方式实例化bean -->
<bean id="bean3Factory" class="com.fengli.beanFactorys.Bean3Factory"></bean>
<bean id="bean3" factory-bean="bean3Factory" factory-method="getInstance"></bean>
</beans>
demo地址:https://github.com/fenglifenglifengli/bean.git
七、参考文档
Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)