一、IOC操作Bean管理——基于xml方式
- Spring有两种类型Bean,一种普通Bean,另外一种工厂Bean(FactoryBean)
- 普通Bean:在配置文件中定义Bean类型就是返回类型
- 工厂Bean:配置这个类为工厂Bean
1)、第一步:创建类,让这个类作为工厂Bean,实现一个接口FactoryBean
2)、第二步:实现接口里面的方法,在实现的方法中定义返回Bean的类型
public class Course {
private String cname;
public void setCname(String cname) {
this.cname = cname;
}
}
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;
}
@Override
public boolean isSingleton() {
return false;
}
}
<bean id="myBean" class="com.demo.Bean.MyBean"></bean>
@Test
public void Test01(){
ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");
Course course=context.getBean("myBean", Course.class);//返回值类型可以不是定义的bean类型!
System.out.println(course); //com.demo.Bean.Course@74ad1f1f
}
二、IOC操作Bean管理(bean作用域)
在Spring里面,默认情况下,Bean是单实例对象,下面进行作用域设置:
(1)、在Spring配置文件Bean标签里面有scope属性,用于设置单实例还是多实例
(2)、scope属性有默认值singleton,表示单实例,还有prototype表示多实例
singleton 和 prototype 区别
a)singleton 单实例,prototype 多实例
b)设置 scope 值是 singleton 时候,加载 spring 配置文件时候就会创建单实例对象 ;设置 scope 值是 prototype 时候,不是在加载 spring 配置文件时候创建对象,在调用 getBean 方法时候创建多实例对象
public class Book {
private String name;
public void setName(String name) {
this.name = name;
}
}
//单实例
<bean id="book" class="com.demo.ch01.Book" scope="singleton">
<property name="name" value="人间失格"></property>
</bean>
@Test
public void Test02(){
ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");
Book book01=context.getBean("book", Book.class);
Book book02=context.getBean("book", Book.class);
System.out.println(book01); //com.demo.ch01.Book@544a2ea6
System.out.println(book02); //com.demo.ch01.Book@544a2ea6
System.out.println(book01==book02); //true
}
//多实例
<bean id="book" class="com.demo.ch01.Book" scope="prototype">
<property name="name" value="人间失格"></property>
</bean>
@Test
public void Test02(){
ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");
Book book01=context.getBean("book", Book.class);
Book book02=context.getBean("book", Book.class);
System.out.println(book01); //com.demo.ch01.Book@544a2ea6
System.out.println(book02); //com.demo.ch01.Book@2e3fc542
System.out.println(book01==book02); //false
}
三、IOC操作Bean管理(Bean的生命周期)
1、生命周期:从对象创建到对象销毁的过程
2、Bean生命周期
(1)、通过构造器创建bean实例(无参数构造)
(2)、为bean的属性设置值和对其他bean引用(调用Set方法)
(3)、调用bean的初始化方法(需要进行配置初始化的方法)
(4)、bean可以使用了(对象获取到了)
(5)、当容器关闭时候,调用bean的销毁的方法
3、演示bean的生命周期
public class Orders {
public Orders() {
System.out.println("第一步 执行无参构造创建bean对象");
}
private String name;
public void setName(String name) {
this.name = name;
System.out.println("第二步 调用Set方法设置属性值");
}
public void initMethod(){
System.out.println("第三步 执行初始化的方法");
}
public void destroyMethod(){
System.out.println("第五步 执行销毁的方法");
}
}
<bean id="orders" c
lass="com.demo.ch02.Orders" init-method="initMethod" destroy-method="destroyMethod">
<property name="name" value="Tom"></property><!--这里就是通过set方式(注入属性)赋值-->
</bean>
</bean>
@Test
public void Test03(){
ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");
Orders orders=context.getBean("orders",Orders.class);
System.out.println("第四步 获取创建bean实例对象");
System.out.println(orders);
context.close(); //手动让bean 实例销毁
}
/*
第一步 执行无参构造创建bean对象
第二步 调用Set方法设置属性值
第三步 执行初始化的方法
第四步 获取创建bean实例对象
com.demo.ch02.Orders@4524411f
第五步 执行销毁的方法
*/
4、bean 的后置处理器,bean 生命周期有七步 (正常生命周期为五步,而配置后置处理器后为七步)
(1)通过构造器创建 bean 实例(无参数构造)
(2)为 bean 的属性设置值和对其他 bean 引用(调用 set 方法)
(3)把 bean 实例传递 bean 后置处理器的方法 postProcessBeforeInitialization
(4)调用 bean 的初始化的方法(需要进行配置初始化的方法)
(5)把 bean 实例传递 bean 后置处理器的方法 postProcessAfterInitialization
(6)bean 可以使用了(对象获取到了)
(7)当容器关闭时候,调用 bean 的销毁的方法(需要进行配置销毁的方法)
四、IOC操作Bean管理(外部属性文件)
方式一、直接配置数据库信息:
public class DataSource {
private String driverClassName;
private String url;
private String username;
private String password;
public void setDriverClassName(String driverClassNamethis.driverClassName = driverClassName;}
public void setUrl(String url) {
this.url = url;}
public void setUsername(String username) {
this.username = username;}
public void setPassword(String password) {
this.password = password;}
}
<bean id="dataSource" class="com.demo.dao.DataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/demo"></property>
<property name="username" value="root"></property>
<property name="password" value="123456"></property>
</bean>
@Test
public void Test04(){
ApplicationContext context=new ClassPathXmlApplicationContext("Dao.xml");
DataSource dataSource=context.getBean("dataSource",DataSource.class);
System.out.println(dataSource); //com.demo.dao.DataSource@6ec8211c
}
方式二、引入外部属性文件配置数据库连接池
(1)、配置Druid(德鲁伊)连接池
(2)、引入Druid(德鲁伊)连接池依赖 jar 包
将下载号的Druid架包复制到lib文件夹里面,并引入架包
(3)、创建外部属性文件properties 格式文件,写数据库信息(Dao.properties)
prop.driverClass=com.mysql.jdbc.Driver
prop.url=jdbc:mysql://localhost:3306/demo
prop.userName=root
prop.password=123456
<!--引入druid配置文件-->
<context:property-placeholder location="classpath:Dao.properties"></context:property-placeholder>
<!--druid连接池-->
<bean id="dataSource" class="com.demo.dao.DataSource">
<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>
@Test
public void Test05(){
ApplicationContext context=new ClassPathXmlApplicationContext("Dao02.xml");
DataSource dataSource=context.getBean("dataSource",DataSource.class);
System.out.println(dataSource); //com.demo.dao.DataSource@6ec8211c
}