Spring--3--ioc

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.jarmysql-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、测试使用

在这里插入图片描述

IOC总结

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值