IOC(Inversion of controll) 控制反转
控制:资源获取的方式。
主动式:(要什么资源就自己创建即可)
BookServlet{
BookService book =new BookService();
AirPlane airplane=new Airplane(); //复杂对象的创建是比较庞大的工程
}
被动式:(资源的获取不是我们创建,而是交给一个容器创建和设置)
BookServlet{
BookService book;
public void set(){
book.checkout(); //因book没有定义,所以一般会报空指针异常
}
}
容器:管理所有的组件(有功能的类);假设BookServlet受容器管理,BookService也受容器管理,容器可以自动的探查出那些组件(类)需要用到另一些组件(类),容器帮助我们创建BookService对象,并把BookService对象赋值过来。(从而实现主动的new变成被动的接受资源)
DI(Dependency Injection):依赖注入.
容器能知道哪个组件(类)运行的时候,需要另一个类(组件),容器通过反射的方式,将容器准备好的BookServlet对象注入到(利用反射给属性赋值)到BookServlet中;
只要是容器管理的组件,都能提供容器提供的强大功能。
Spring的几个小问题与细节
1、**src:**源码包开始的路径,称为类路径的开始
src是项目默认的一个源码包文件,还可以自己创建**Source Folder文件,**但是最终所有的源码包文件都会被合并在类路径里面。
2、导包
项目需要什么包就导入什么包,commons-logging-1.2.jar 这个jar包在spring中必不可少。
3、导包后再写配置文件
4、在eclipse中导入了插件后,文件会有s标志,而spring就接管了所有s标志的类文件。
5、ApplicationContext 是IOC容器的接口
new ClassPathXmlApplicationContext(“ioc.xml”); xml文件放在类路径下,也就是可以直接放在一个源码包文件下。
new FileSystemXmlApplicationContext(“F://ioc.xml”); xml文件放在磁盘路径下。
6、容器中对象的创建是在容器创建完成的时候就已经创建了。也就是在利用ApplicationContext这个方法的时候就已经创建好了容器。每一个组件在ioc容器中是单例的(就是不管获取多少次,创建就实现一次),而且是在容器创建完成的时候就已经完成了对象的创建。
7、容器中如果没有想获取的组件,就会报异常,NoBeanDef…
8、
1)利用无参构造器和setter方法结合的方式进行对象构造和赋值。
ioc容器在创建这个对象的时候,(property)是利用setter方法来给对象中的属性进行赋值的,所以在对象类中一定要有setter方法。(property里面的name的值)是由setter方法set后面的首字母小写决定的,也就是property的name不是类中定义的属性名,而是setter方法的那个首字母小写即可。
2)用类的有参数构造器方法进行对象赋值。
a、
b、
3)用p名称空间进行简化代码的赋值。
首先在配置文件导入p标签,下方有namespace的前提是已经在eclipse导入了插件。
然后利用p标签的形式新建对象并且赋值。
9、不是单独类型的变量进行容器内对象构建及其赋值**(内部bean不能直接获取,不存在的,只能用于内容)**
1)、null 数据。例如:name在类中有默认值,若想给其设为null,只能采取这种方式。
2)、引用类型赋值(类中嵌套类进行这个内部类的赋值)
第一种方式:嵌套写在内部。若外部也有一个car的bean,跟内部的bean不同
第二种方式:直接写在外部。引用的就是外部定义的bean,所以这两个car相同
3)、给list类型的变量赋值。(直接外部设置,内部引用或者直接写在内部)
4)、给map类型的变量赋值
5)、给properties类型的变量赋值
6)、给util名称空间创建集合类型的bean。
先导入名称空间util
外部利用util写一个某个类型的数据,通过id直接可以引用即可。
7)、给级联对象属性赋值(类中嵌套的那个类中的变量)
如果引用外部的car,在级联属性的值修改时,对应的外部bean的值也会被修改。
Spring的bean深化知识
1、通过继承实现bean信息的重用
利用parent继承其他的bean信息,需要修改信息直接修改想修改的信息即可。
2、利用abstract来标注bean,从而使它只能被继承而不能被获取
3、bean之间的依赖,只是改变xml文件的创建顺序的
本来是先创建了car,然后创建了person和book
如果用了depend-on的话,在创建car之前会创建person和book
4、bean之间的作用域,看配置文件配置的bean是单实例的还是其他。默认单实例
5、创建有生命周期的bean
在类中定义初始化和销毁方法
在配置文件中配置
在测试类中测试
5、bean的后置处理器
spring有一个接口,**后置处理器(BeanPostProcessor)**后置处理器:可以在bean的初始化前后调用方法
创建一个接口的实现类
在配置文件中配置这个实现类
Spring利用工厂创建bean
配置通过静态工厂方法创建的bean,实例工厂方法创建的bean。FactoryBean
bean的默认配置就是根据无餐构造方法new出来的bean -->
工厂模式,工厂帮我们创建bean
**静态工厂:**工厂本身不用创建对象,都是通过静态方法调用,也就是工厂类.工厂方法名
**实例工厂:**工厂本身需要创建对象。
工厂类 工厂对象=new 工厂类();
工厂对象.工厂方法
1、静态工厂
静态工厂类的编写:
在配置文件中配置这个静态工厂。
使用这个静态工厂。 根据方法,实际上调用方法就产生Airplane对象。
2、实例工厂
实例工厂类的编写
在配置文件中配置这个实例工厂。
使用这个实例工厂。 根据方法,实际上调用方法就产生Airplane对象。
3、FactoryBean使用
建立一个FactoryBean的实现类,spring默认这些实现类就是一个工厂。
在配置文件文件中注册这个工厂实现类。
使用
Spring管理连接池
**1、导入连接池和数据库所需要的jar包。**c3p0-0.9.2.1.jar 与 mysql-connector-java-6.0.2.jar。
2、在xml文件中配置这个连接池
3、获取连接池
4、引用外部属性文件
先导入一个命名空间 context
创建一个.properties文件用来存放需要的数据
配置文件利用**context:property-placeholder来引用刚所创建的这个文件,利用${}**来获取所需的数据
基于xml的自动装配(自定义类型自动赋值)
这种自动赋值仅限于自定义类型的数据进行赋值。
手动赋值或者利用antowire进行自动配置赋值
SPEL测试(配置文件的value引用)
它能使用的一些场景:
它场景的一些实例:
Spring的核心容器
1、BeanFactory
BeanFactory beanfactory=new XMLBeanFactory(new FileSystemResource("文件所在位置"));
2、ApplicationContext
两种创建方法
Spring通过注解给容器中加入组件
1、通过注解给容器加入Dao、service、controller。
注意:一定要加入context命名空间、spring-aop-4.3.6.RELEASE.jar包
通过注解给容器中加入组件。spring有以下四个注解:
这四个任何一个注解都可以快速将组件入容器中。
这样的方式注入的组件的****id名就是类名首字母小写的名称。模式就是单例模式
因默认的就是类名的首字母小写所构成的名称是id名,如果不想要此名称**。可以直接在加注释的时候自定义名称即可****。例如** @controller(“自定义的名称”) 此时id名称就是自定义的名称。
因默认的这个组件是单例的组件,若想改变其为其他模式。在给该组件加入注释的时候,可以直接在注释下加一个 @Scope(value=“名称”)
@Controller: 控制器层组件加的注解(servlet)
@Service: 业务逻辑层添加的注解(service)
@Repository: 给数据库层加入注解也就是持久化层(dao层)
@Component: 给不属于以上几层的组件加入这个注解
注释可以随便加,spring底层不会去验证这个组件
是否如注释所说给对应的层加入对应的注解无所谓,但是最好那样做。
1)、给要添加的组件标四个注解的任何一个
2)、告诉spring自动扫描加了注解的组件,依赖context名称空间
3)、一定要导入spring-aop-4.3.6.RELEASE.jar包
根据id名称获取到所对应的组件。
2、扫描带有注释的类的时候进行要扫描类的筛选处理。
1、排除不需要的组件
2、指定需要哪些组件
3、DI(依赖注入)@Autowired
对于属性的自动注入,这个注释会让spring自己去容器中找对应的组件进行赋值,不用手动new操作。
@Autowired原理:
1)先按照类型去容器中找到对应的组件。找到就赋值,没有找到就报异常。若找到多个。就以变量名的首字母小写作为id再次寻找。
2)若再次寻找的时候,若还是没有找到就报错。
3)可以使用**@Autowired(required=false)这样若找不到就不会报错,就自动装配为null**
利用**@Qualifier**来改变默认的id名称。
1、若改成的id名称能够找到就装配。
2、若改成的id名称找不到就报错。
2)、对方法进行@Autowired标注
a、若对方法进行了标志,则这个方法也会在bean创建的时候运行
b、这个方法的每一个参数都会被自动注入
@Resource原理:@Inject原理
与**@Autowired**等同,都也可以自动装配控件。
@Autowird与@Resource的区别:
1)@Resource的扩展性很强,因为@Resource是java的标准,@Autowird是spring框架提供的,也就是说若换一个框架@Autowired就不行了。
2)@Resource里面无required属性,这样的话,找不到就会报错。不像@Autowired(required=false)这样找不到就为空。
Spring的单元测试
1、**导包。**导入spring的单元测试包:spring-test-4.3.6.RELEASE.jar
2、**@ContextConfiguration(locations="")😗*来指定spring配置文件的位置
3、**@RunWith():**来指定利用哪种驱动来进行单元测试,
以前的测试驱动是jUnit
默认是junit,spring的驱动是SpringJUnit4ClassRunner.class
4、使用。导入配置文件,利用注解进行自动配置。不需用先获取配置文件,然后再利用ioc.getBean()来获取组件。
Spring的泛型依赖注入(Spring 4.0后加)
Sping可以使用带泛型的父类类型来确定这个子类的类型。
1、定义一个泛型抽象类BaseDao
2、定义一个泛型类BaseService
3、定义继承BaseDao的实现类
4、定义继承BaseService的类
5、测试使用