文章目录
1. IOC的Bean管理
在Spring中有两种类型的Bean,一种是普通Bean另一种是工厂Bean;
-
普通bean:定义什么类型,那么创建对象时就是什么类型;
-
工厂bean:在配置文件时bean类型可以和返回的类型不一样;
主要是需要实现一个接口(FactoryBean),然后实现其中的方法getObject,这样就可以使得,配置文件中定义的类和自己获得的类类型不一致了;
如下:
创建一个实现FactoryBean接口的类;
public class MyBook implements FactoryBean {
@Override
public Object getObject() throws Exception {
/*这个类就是用来返回你这个类在配置文件中进行配置后
需要返回的类;所以想返回什么类,在这里return什么类
就可以了;当然这个也可以添加泛型;
如下: 我想通过这个类返回一个Book类;
*/
Book book = new Book();
book.setBname("骆驼祥子");
return book;
}
@Override
public Class<?> getObjectType() {
return null;
}
}
配置文件的书写:
<?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">
<!--这里就只是创建了一个MyBook类的对象-->
<bean id="myBook" class="cn.dxs.OnCollection.MyBook"/>
</beans>
测试类:
public class TestMyBook {
@Test
public void test(){
//解析配置文件,但是路径一定要对;
ApplicationContext context = new ClassPathXmlApplicationContext("cn/dxs/xml/Bookconfig.xml");
//由于这里获得的是Book类,所以设置好;
Book myBook = context.getBean("myBook", Book.class);
System.out.println(myBook);
}
}
运行后的结果:确实没有问题;
2. IOC中Bean的作用域
2.1 Bean中的对象是单实例对象(默认)
单实例,就是说所有通过这个配置文件创建出来的对象都是一样的,就是一种单例模式;当然这是默认情况下,还有一种就是
将默认的单实例对象修改为多实例对象,主要用到的bean标签中的属性:scope;
如下:
再次运行上面的代码,果然两个对象的地址已经不一样了;
scope属性主要有两个值,一个是singleton(单个实例对象),在解析配置文件时,同时已经创建了对象;一个是prototype(多实例对象),只有在getBean的时候才开始创建对象;这两个就有点类似于非延时加载,和延时加载;
3. 在IOC中Bean的生命周期
Bean的生命周期:
第一步:先要创建通过构造器创建一个bean实例(无参构造函数);
第二步:为bean的各项属性添加值(也可以引用其它的bean,主要使用的时set方法);
public class Book {
//在这个类里面创建一个简单属性;
String Bname;
//创建一个无参构造函数;
public Book(){
System.out.println("1.创建一个构造函数");
}
@Override
public String toString() {
return "Book{" +
"Bname='" + Bname + '\'' +
'}';
}
//创建一个set方法
public void setBname(String bname) {
System.out.println("2.通过set方法创建属性");
Bname = bname;
}
//定义一个初始化的方法;
public void initbook(){
System.out.println("3.假定这是一个初始化的方法");
}
public void destroy(){
System.out.println("5.假定这是销时后的才执行的方法");
}
}
第三步:调用Bean的初始化方法(目前不怎么清楚有什么用);
第四步:获取了Bean对象;
第五步:容器关闭,对Bean进行销毁;
@Test
public void test(){
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("cn/dxs/xml/Bookconfig.xml");
System.out.println("第四步,这里获得了对象");
//由于这里获得的是Book类,所以设置好;
Book book = context.getBean("book", Book.class);
System.out.println(book);
//关闭,只有ApplicationContext接口的实现类有;
context.close();
}
运行的结果(正好是这个方向,从开始到销毁)
3.1 bean的后置处理器
创建后置处理器需要使用到接口BeanPostProcessor;当将后置处理器放入时,Bean的生命周期就有了7步
创建一个类(后置处理器)
再次在配置文件中进行配置:
运行之后的结果:
所以在拥有后置处理器之后,Bean的生命周期就已经有了7步;
- IOC中的XML自动装配
概念:根据指定的装配规则(属性名或者属性类型),Spring自动将匹配的属性值注入;就比如以前插入属性可能需要使用Property标签,现在有了新方法;(现在应用主要是用来导入另一个类作为属性)
4. 在配置文件中引入外部的属性文件
这个在xml配置文件中,一般引入外部文件,比如说,你要连接数据库,这时,你可以先将连接的用户名,密码全部放在外部的properties文件里面,方便读取;
将外部的属性文件引入到Spring配置文件中:
引入context的名称空间: