spring学习笔记2
IOC操作bean管理(FactoryBean)
1.Spring有两张类型bean,一种普通bean,另一种工厂bean(FactoryBean)
2.普通bean:在配置文件中定义bean类型就是返回类型
3.工厂bean:在配置文件定义bean类型可以和返回类型不一样
第一步 创建类,让这个类作为工厂bean,实现接口FactoryBean
第二步 实现接口里面的方法,在实现的方法中定义返回的bean的类型
<bean id="myBean" class="com.atguigu.spring5.factoryBean.MyBean"> </bean>
public class MyBean implements FactoryBean<Course> { @Override public Course getObject() throws Exception { Course course = new Course(); course.setCname("abc"); return course; } @Override public Class<?> getObjectType() { return null; } }
bean的作用域
1.即在spring里面设置创建bean实例是单实例还是多实例(即创建多个对象是,所创建的对象是同一个对象还是不同的多个对象)
2.spring中默认是单实例
3.如何设置单实例还是多实例
(1)在Spring配置文件bean标签里面有属性(scope)用于设置单实例还是多实例
(2)scope属性值
第一个值,默认值,singleton,表示单实例对象
第二个值,prototype,表示多实例对象
<bean id="book" class="com.atguigu.spring5.collectionType.Book" scope="prototype"> <property name="books" ref="bookList"></property> </bean>
(3)singleton和prototype区别
第一 singleton单实例,prototype多实例
第二 设置scope值是singleton时候,加载spring配置文件时就会创建单实例对象
设置scope值是prototype时候,不是加载spring配置文件时候创建对象 ,而是在调用getBean方法时候创建多实例对象
IOC操作Bean管理(bean生命周期)
1、生命周期
(1)从对象创建到对象销毁的过程
2、bean生命周期
(1)通过构造器创建bean实例(无参数构造)
(2)为bean的属性设置值和对其他bean引用(调用set方法)
(3)调用bean的初始化方法(需要进行配置初始化的方法)
(4)bean可以使用了(对象获取到了)
(5)当容器关闭是,调用bean的销毁方法(需要进行配置销毁的方法)
3.演示生命周的过程
<bean id="orders" class="com.atguigu.spring5.bean.Orders" init-method="initMethod" destroy-method="destroyMethod"> <property name="oname" value="手机"></property> </bean>
public class Orders { private String oname; public Orders(){ System.out.println("第一步,只想无参数构造,创建对象"); } public void setOname(String oname) { this.oname = oname; System.out.println("第二步,调用set方法,设置属性的值"); } //创建执行的初始化方法 public void initMethod(){ System.out.println("第三步,执行初始化方法"); } //销毁方法 public void destroyMethod(){ System.out.println("第五步,执行销毁方法"); } }
@org.junit.Test public void testbean(){ ApplicationContext context = new ClassPathXmlApplicationContext("bean4.xml"); Orders orders= context.getBean("orders", Orders.class); System.out.println("第四步,使用bean对象"); System.out.println(orders); //手动让bean实例关闭 ((ClassPathXmlApplicationContext)context).close(); }
4.加上bean的后置处理器,bean生命周期共有7步
(1)通过构造器创建bean实例(无参数构造)
(2)为bean的属性设置值和对其他bean引用(调用set方法)
(3)调用bean的初始化方法(需要进行配置初始化的方法)
(4)bean可以使用了(对象获取到了)
(5)当容器关闭是,调用bean的销毁方法(需要进行配置销毁的方法)
<bean id="orders" class="com.atguigu.spring5.bean.Orders" init-method="initMethod" destroy-method="destroyMethod"> <property name="oname" value="手机"></property> </bean> <!--配置后置处理器--> <bean id="myBeanPost" class="com.atguigu.spring5.bean.MyBeanPost"></bean>
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; } }
xml自动装配
1.什么是自动装配?
(1)根据指定装配规则(属性名称或者属性类型),Spring自动装配的属性值进行注入
根据属性名称自动装配
<bean id="emp" class="com.atguigu.spring5.autowire.Emp" autowire="byName"> <!-- <property name="dept" ref="dept"></property>--> </bean> <bean id="dept" class="com.atguigu.spring5.autowire.Dept"></bean>
根据属性类行自动装配
<!--实现自动装配 bean标签属性autowire,配置自动装配 autowire属性常用两个值 byName根据属性名称注入,注入值bean的id类型和类属性名称一样 byType根据属性类型注入--> <bean id="emp" class="com.atguigu.spring5.autowire.Emp" autowire="byType"> <!-- <property name="dept" ref="dept"></property>--> </bean> <bean id="dept" class="com.atguigu.spring5.autowire.Dept"></bean>
IOC操作bean管理(外部属性文件)
以操作数据库为例
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:util="http://www.springframework.org/schema/util" xmlns:context="http://www.springframework.org/schema/context" 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 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!--直接配置连接池--> <!-- <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">--> <!-- <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>--> <!-- <property name="url" value="jdbc:mysql://localhost:3306/userDb"></property>--> <!-- <property name="username" value="root"></property>--> <!-- <property name="password" value="root"></property>--> <!-- </bean>--> <context:property-placeholder location="classpath:jdbc.properties"/> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="${prop.driverClass}"></property> <property name="url" value="${prop.url}"></property> <property name="username" value="${prop.userName}"></property> <property name="password" value="${prop.password}"></property> </bean>
prop.driverClass=com.mysql.jdbc.Driver
prop.url=jdbc:mysql://localhost:3306/userDb
prop.userName=root
prop.password=root