前言
这一节讲bean
1.初始spring
点projects
Framework是spring的基础
spring官网
这三个主流
2. 系统架构
3. 核心概念
4. Ioc入门案例
其中Dao就是我们原来管理数据库的,service就是业务层
这个代码很简单
要交给spring管理,首先要有一个配置文件
一开始这里的xml文件是没有spring配置的
我们得先导包才有spring配置
这样右键创建xml就有spring了
这样我们就可以拿文件去运行这个bean了,给两个实现类都配置一个bean,那么这个bean就是对象了
先创建容器,然后就可以在里面根据id获取对象了
5. DI入门案例
DI主要就是搞bean里面类的关系了
BookServiceImpl:
原:
现在:
现在我们开始写配置来得到这两个对象的关系
applicationContext.xml:
原:
现在:
BookServiceImpl:
现在业务层一个new都没有了
注意那个setBookDao这个方法是容器执行的
6. bean配置

但是构造方法有参时就会报错,所以spring调用的构造方法时无参的
对于spring的报错信息,我们拉到最后面,看最后的异常
如果这个不行,就倒着看上一个报错信息
init是构造方法,这个就表示无参的构造方法
这个就是倒数第二个报错
7.2 静态工厂
这里是一个工厂方法,使用它就可以创建出来
这种方式该怎么交给spring管理呢
这样就可以了
这样我们就是通过静态工厂里面的静态方法来实例化bean了
7.3 实例工厂
意思就是工厂里面的方法不是静态的
我们先来表演一下普通的运行
<bean id="bookFactory" class="com.itheima.factory.BookDaoFactory"/>
<bean id="bookDao" factory-bean="bookFactory" factory-method="getBookDao"/>
我们这个的缺点就是造了一个多余的bean
现在我们开始改造
我们定义一个新的类BookDaoFactoryBean
然后重写方法,继承泛型接口
这样我们的配置就变简单了
我们只需要这样写就可以拿到bean了,而不是工厂对象
我们这个是单例的,
怎么改非单例呢
我们只需要增加一个重写方法就可
多的这个方法只需要返回false就是非单例的了
8. bean的生命周期
一共两个阶段,一个是bean创建以后,一个是消亡之前
现在开始配置,不然不可能平白无故就运行了
这里便发现了,destroy没有执行
为什么呢
因为程序执行完了,虚拟机退出了,没有给bean销毁的机会
怎么实现销毁呢,就是在程序结束之前,把这个容器给关闭了
但是没有这个方法
这是因为ApplicationContext这个接口,不具有这个close方法
而ClassPathXmlApplicationContext是ApplicationContext的一个实现类,它有close方法,这里有很多重继承,所以暂时还不能用
所以改一下类就可以了
这样就可以了
这个直接关闭的方式比较暴力,我们可以设置关闭钩子,就是告诉虚拟机,你自己退出前关闭一下
ctx.registerShutdownHook();
加上这句话就可以了
close关闭比较暴力,所以我们一般用关闭钩子
因为万一close之后还有执行相应代码呢
下面还有一个对生命周期操作的方法,就是按照spring的套路来
BookServiceImpl:
原:
就是对应继承接口,然后实现方法就可以了
这样的话就算我们执行dao的代码,也会加载service的,因为都是加载那个配置文件,那么就会加载service的,那么自动执行那两个方法,那么就会打印,但是还是得要关闭钩子,不然也看不见
这样我们就知道了
afterPropertiesSet这个方法是在我们属性设置完之后才执行的
看这个我们就知道了为什么afterPropertiesSet在后面执行了
总结
下一节讲依赖注入