Spring第一天
Spring体系结构
包含核心容器,AOP springJDBCTemplate, springMVC,单元测试
先写一段最朴素的数据库查询代码
上面的代码是需要依赖mysql的jar包的,如果把mysql的依赖去掉,那程序在编译的时候,就会发生编译期错误,还没等到运行期,在编译期就会发生错误。这个代码的耦合性特别强,独立性特别差!!!在代码中直接用到了某个包,这样的代码依赖性特别强,没有这个包,那在编译期就会发生错误
换成上面的代码,如果没有MySQL的jar包,那么在编译期间就不会发生错误了,而是在运行期间发生错误
解耦的思路:第一步: 使用反射来创建对象,避免使用new关键字,因为new 关键字必须得需要一个类,必须得依赖这个类,而上面的代码中用了反射就只需要一个字符串了,只依赖这个字符串了,这样就会降低当前代码和new后面这个类的耦合性了
第二步:那个字符串在代码中写死了,所以我们就可以通过配置文件来获取要创建的对象的类名
依赖问题分析
先写一个业务层的实现类,写一个保存账户的实现类
这种new来new去肯定不行啊,耦合性太强了,独立性太差了,那该怎么办呢? 我们可以用工厂模式来解耦,我们可以创建一个生产bean对象的工厂类beanFactory
那啥是bean呢?bean就是可重用组件的意思,可重用就是可反复使用的意思,组件就是这个项目的组成部分
javabean是不等于实体类的,,,Javabean是用Java语言编写的可重用组件,而实体类只是其中一个组件而已
上面我们说了,要解耦,有两步:第一,反射 第二、配置文件
这里配置文件有xml和properties
这里我们先用properties,因为xml可以设计其他的一些知识点
分析工厂模式中的问题并改造
此时,这5个对象是多例的
这样单例模式下,每次初始化得到的 i 都是 1,这样就不需要多例模式了
通过newinstance() 每次创建的都是一个新的对象,所以要想得到单例模式,newinstance只能使用一次
IOC的概念 Inversion of Control
Spring基于XML的IOC环境搭建和入门
先看一下之前创建的properties配置文件 是key和value形式 key=value
之前解析properties是自己解析的,而现在解析xml就交给Spring了
ApplicationContext的三个实现类
单例模式:只在开始的时候创建一次对象,后面就不创建了,只在容器中拿之前创建的对象比较节省,只第一次吃新鲜菜,之后都是吃剩菜所以适合用ApplicationContext,在刚开始的时候就把所有的对象都创建出来,然后放到容器中,之后想要就到这个容器中来取
多例模式:每次用的时候,都会新创建一个对象。不用容器里面的每次都吃新鲜菜。所以适合用BeanFactory,用的时候才去创建对象。不然的话,如果像ApplicationContext那样,就会每次用的时候都会把所有类都创建一次对象,太浪费了我本来只吃一种菜,结果你却把所有的菜都煮熟了。我第二次又想只吃一种菜,结果你又把所有的菜都煮熟了,这岂不是太浪费了
Spring对bean的管理细节
首先先明确一下,bean id=“某某某” class=“其他”> 这里面属性id对应的某某某就是map的key, class属性对应的其他就是类名,这个类名到时候通过反射生成对象
Spring中bean的细节之三种创建Bean对象的方式
额外补充个知识点:就是最简单的构造方法知识点
构造方法:专门用来创建对象的方法,当我们通过关键字new创建对象时,其实就是在调用构造方法,
1、构造方法必须和所在的类名称完全一样,就连大小写也要一样
2、构造方法不要写返回值类型,连void都不写
3、构造方法不能return一个具体的返回值
4、如果没有编写任何构造方法,那么编译器将会默认赠送一个构造方法,没有参数,也没有方法体
5、一旦编写了至少一个构造方法,那么编译器将不再赠送
6、构造方法也是可以进行重载的
存在jar包中的类怎么创建bean对象呢?
第三种方式,配置工厂类里面静态方法返回的对象
补充个知识点,判断bean创建的对象是单例还是多例,只需要在默认构造函数里面加一个打印语句,第一次创建对象,肯定会打印这条语句,第二次创建对象,如果还打印这条语句,那就是多例模式,如果第二次不打印就是单例模式了,这是一种方法。另外一种方法,直接打印这两个对象,然后判断是不是相等,如果相等,就说明是一个对象,那就是单例模式了,如果不相等,则反之
Spring中bean的细节之作用范围
如果bean标签里面的scope设置为singleton,则bean标签创建的对象就是单例的,之后用这个bean标签创建的对象都是同一个
如果bean标签里面的scope设置为prototype,则bean标签创建的对象就是多例的,之后用这个bean标签创建的对象都是不一样的,每次创建都是不同的对象
global-session 就是把集群中的服务器的session都当成是一个session,也就是global-session
Spring中bean的细节之生命周期
Spring的依赖注入
service 肯定会调用 dao,IOC的作用是降低耦合,但是依赖关系肯定还在,依赖关系的管理就交给Spring来维护
依赖关系:在当前类中需要用到其他类的对象
依赖关系的维护就叫做依赖注入
依赖注入有三类:基本类型和String,其他的bean类型,复杂类型集合类型
注入的方式有3种:第一种,使用构造函数提供 第二种,使用set方法提供 第三种,使用注解提供
构造函数注入
set方法注入,使用property标签
复杂类型的注入
Spring的新注解Configuration和ComponentScan
细节注意点:当配置类作为AnnotationConfigApplicationContext对象创建的参数时,该注解@Configuration可以不写
Spring的新注解Bean
细节注意一下:当我们使用注解配置方法时,如果方法有参数,Spring框架会去容器中查找有没有可用的bean对象,查找的方法和Autowired注解的作用是一样的
比如:上面
@Bean(name="runner")
public QueryRunner createQueryRunner(DataSource dataSource){
return new QueryRunner(dataSource)
}
这里面我们用@Bean注解配置方法,但是方法里面有DataSource 参数,所以我们必须要看看这个DataSource是不是bean对象,如果不是,必须要注入
Spring的新注解Import
总结一下:
AnnotationConfigApplicationContext 类创建对象时,传入的类字节码,那么这些类上面的@Configuration都是可写可不写。否则的话,就必须写!
如果其他的配置还不想写的话,那么就可以用@Import注解