IOC

IOC-- Inversion of Control

在这里插入图片描述
控制:资源的获取方式
主动式:(要什么资源都自己创建即可)
BookServlet{
BookService bs = new BookService();
AirPlane ap = new AirPlane();//复杂对象的创建是比较庞大的工程

被动式:资源的获取不是我们自己创建,而是交给一个容器来创建
BookServlet{
BookService bs;
public void main(){
bs.checkout();
}

容器:管理所有的组件(有功能的类);假设,BookServlet受容器管理,BookService也受容器管理;容器可以自动的探查出那些组件(类)需要用到另一些组件(类);容器帮我们创建BookService对象,并把BookService对象赋值过去;

容器:主动的new资源变为被动的接受资源

控制反转

一种设计思想
将设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制
IOC容器控制了对象,控制了外部资源获取(不只是对象包括比如文件等)
反转,因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象。

DI-- Dependency Injection 依赖注入

容器能知道哪个组件(类)运行的时候,需要另一个类(组件);容器能通过反射的形式,将容器中准备好的BookService对象注入(利用反射给属性赋值)到BookServlet中;

只要容器管理的组件,都能使容器提供的强大功能。

由容器动态的将某个依赖关系注入到组件之中
谁依赖于谁:应用程序依赖于IOC容器
为什么需要依赖:应用程序需要IOC容器来提供对象需要的外部资源
谁注入谁:IOC容器注入应用程序的某个对象,应用程序依赖的对象
注入了什么:注入某个对象所需要的外部资源(包括对象,资源,常量数据)

在这里插入图片描述

在这里插入图片描述

IOC几个注意点:

1、ApplicationContext(Ioc容器的接口)
2、给容器中注册一个组件,我们也从容器中按照ID拿到了这个组件的对象
	组件的创建工作,是容器完成
	Person对象是什么时候创建好了呢?
	容器中对象的创建在容器创建完成的时候就已经创建好了
3、同一个组件在Ioc容器中是单例的,容器启动完成都已经创建准备好了
4、容器中如果没有这个组件,获取组件?会报异常
5、IOC容器在创建这个组件对象的时候,(property)会利用setter方法为javaBean的属性进行赋值
6、JavaBean的属性名是由什么决定?getter/setter方法是属性名;set方法去掉前面set,后面一串字母小写

在这里插入图片描述

可使用如图方式获取bean
在这里插入图片描述
1、使用有参构造函数创建
在这里插入图片描述
Person04:
Index :指定属性顺序
Type:如果出现重载,可通过类型来判断调用哪个构造方法
在这里插入图片描述
输出:
在这里插入图片描述
名称空间:在XML中名称空间是防止标签名重复
使用命名空间为bean赋值
(idea中直接在 bean标签中输入p:,按alt+enter会自动生成头部文件
在这里插入图片描述

在这里插入图片描述
ref引用外部的值,如果值修改,则修改的都是同一个bean
使用内部bean,在property 中使用bean 标签,内部bean只能内部使用,不能被获取
在这里插入图片描述
使用list标签
在这里插入图片描述
map使用
在这里插入图片描述
properties使用
在这里插入图片描述
util名称空间创建集合bean,方便调用
在这里插入图片描述
级联属性赋值 (级联属性:属性的属性) 注意:原来的bean属性可能会被修改
在这里插入图片描述
parent 指定当前bean配置信息继承于哪个
在这里插入图片描述
abstract=“true” 代表这个bean配置是抽象的,不能获取他的实例,只能被继承
原来bean创建的顺序,是按照bean配置的顺序来的。也可改变创建的顺序。使用depends-on,按照depends-on中的顺序进行创建(会先创建person01,person02,后再创建Person11)

<beanclass="com.test.beans.Person"id="person11"parent="person01"depends-on="person01,person02">
<propertyname="name"value="lala"></property>
</bean>

Bean的作用域 默认是单实例
修改为多实例,scope为prototype

<bean class="com.test.beans.Person" id="person11" scope=""prototype>
<propertyname="name"value="lala"></property>
</bean>

prototype多实例
1、容器启动时不会默认创建bean
2、获取的时候创建
3、每次获取都会创建一个新的对象
Singleton:单实例 默认
1、在容器启动之前就已经创建好对象,保存在容器中了
2、任何获取都是获取之前创建好的那个对象

工厂模式
工厂帮我们创建对象,有一个专门帮我们创建对象的类,就是工厂
静态工厂:工厂本身不用创建对象,通过静态调用,对象= 工厂类.工厂方法名();
实例工厂:工厂本身需要创建对象
工厂类 工厂对象= new 工厂类();
工厂对象.getPerson(“张三”);
Factory-method:指定工厂对象中哪个是工厂方法
Factory-bean:指定使用哪个工厂方法
在这里插入图片描述
Xml 中引用外部配置文件
在这里插入图片描述
通过给bean上加入注解,可以快速的将bean加入到IOC容器中
Spring有四个注解
@Controller:控制器,我们推荐给控制器层的组件加这个注解
@Service: 业务逻辑
@Respository :给数据库层(持久化层:dao层)的组件添加这个注解
@Component:给不属于以上几层的组件添加这个注解

注解可以随便加,Spring底层不会去验证你的这个组件
是否如你注解所说就是一个dao层的或者就是一个servlet层的组件
推荐各自层加各自注解
在这里插入图片描述在这里插入图片描述
@Autowired 、@Resource、@Inject 都是自动装配
@Autowired:最强大,Spring自己的注解
@Resource:j2ee,java的标准
扩展性更强,因为是Java的标准,如果切换成另一个容器框架,@resource还是可以使用的

**单元测试**

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值