「这是我参与2022首次更文挑战的第12天,活动详情查看:2022首次更文挑战」
前言
路遥说,在一个平凡的世界里,人要承受一定的痛苦和不安。但只要相信个体奋斗的力量,坚定地与生存搏斗,就能过上想要的生活。
很喜欢《平凡的世界》的一句话,一直不断的鼓励我努力向前,也送个各位看到这个写的很烂的文章的人,共勉~
FactotyBean
Spring 有两种类型bean,一种普通bean,另外一种工厂bean(FactoryBean)
(1)普通bean在配置文件中,定义bean类型就是返回类型
(2)工厂bean在配置文件中定义bean类型可以和返回类型不一样
第一步创建类,让这个类作为工厂Bean,实现接口FactoryBean
第二步实现接口里的方法,在实现方法中定义返回的bean类型
如下程序:
xm文件中定义的返回bean返回类型是Mybean
然后我实现接口后,定义返回的类型为Course类型的bean
package com.caq.spring5.factorybean;
import com.caq.spring5.collectiontype.Course;
import org.springframework.beans.factory.FactoryBean;
public class MyBean implements FactoryBean<Course> {
// 定义返回bean
@Override
public Course getObject() throws Exception {
Course course = new Course();
course.setCname("abc");
return course;
}
@Override
public Class<?> getObjectType() {
return null;
}
@Override
public boolean isSingleton() {
return false;
}
}
bean作用域
(1)在spring里,设置创建Bean实例是单实例还是多实例。
(2)在spring里,默认设置创建Bean实例是单实例。
(3)如何设置单实例还是多实例。
spring配置文件bean标签里scope属性用于设置单实例还是多实例。
scope属性值:第一个,默认值,singleton,表示单实例对象;第二个值:prototype,表示多实例对象。
<?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:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
<bean id="myBean" class="com.caq.spring5.factorybean.MyBean">
</bean>
</beans>
因为是多实例所以是两个不同的地址
(4)singleton 与 prototype区别
第一,singleton表示单实例,prototype表示多实例。
第二,设置Scope是singleton时,加载spring配置文件时侯就会创建单实例对象;
设置Scope是prototype时,不是加载spring配置文件时侯创建对象,而是在调用getBean方法时创建多实例对象。
request,表示一次请求,每次创建对象放到request域对象中。
session,表示一次会话,每次创建对象放到session域对象中。
生命周期
什么是生命周期?
从对象创建到对象销毁的过程
bean生命周期
(1)通过构造器创建bean实例(无参数构造)
(2)为bean的属性设置值和对其他bean引用(调用set方法) (3)调用bean的初始化的方法(需要进行配置)
(4)bean可以使用了(对象获取到了)
(5)当容器关闭的时候,调用bean的销毁的方法(需要进行配置销毁的方法)
bean的后置处理器,bean生命周期有七步
(1)通过构造器创建bean实例(无参数构造)
(2)为bean的属性设置值和对其他bean引用(调用set方法)
(3)把bean实例传递bean后置处理器的方法postProcessBeforeInitialization
(4)调用bean的初始化的方法(需要进行配置)
(5)把bean实例传递bean后置处理器的方法postProcessAfterInitialization
(6)bean可以使用了(对象获取到了)
(7)当容器关闭的时候,调用bean的销毁的方法(需要进行配置销毁的方法)
package com.caq.spring5.bean;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.lang.Nullable;
public class MyBeanPost implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("在初始化之前执行的方法");
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("在初始化之后执行的方法");
return bean;
}
}
package com.caq.spring5.bean;
public class Orders {
private String oname;
public Orders() {
System.out.println("第一步 执行无参构造创建bean实例");
}
public void setOname(String oname){
this.oname = oname;
System.out.println("第二步,调用set方法设置值");
}
public void initMethod(){
System.out.println("第三部 执行初始化方法");
}
public void destoryMethod(){
System.out.println("第五步 执行销毁的方法");
}
}
<?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:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
<bean id="orders" class="com.caq.spring5.bean.Orders" init-method="initMethod" destroy-method="destoryMethod">
<property name="oname" value="手机"></property>
</bean>
<!-- 配置后置处理器-->
<bean id="myBeanPost" class="com.caq.spring5.bean.MyBeanPost"></bean>
</beans>
自动装配
-
什么是自动装配
(1)根据指定装配规则(属性名称或者属性类型),Spring自动将匹配的属性值进行注入
bean标签属性autowire,配置自动装配autowire属性常用两个值:
byName根据属性名称注入,注入值bean 的id 值和类属性名称一样
byType根据属性类型注入
根据名称就按照id(注入值bean 的id 值和类属性名称一样)
类型就是class后面的
<?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:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">
<!-- 实现自动装配-->
<!-- bean标签属性autowire,配置自动装配
autowire属性常用两个值:
byName根据属性名称注入 bean的id值和类里的属性一致
byType根据属性类型注入
-->
<bean id="emp" class="com.caq.spring5.authwire.Emp" autowire="byType">
<!-- <property name="dept" ref="dept"></property>-->
</bean>
<bean id="dept" class="com.caq.spring5.authwire.Dept"></bean>
</beans>