微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Spring IOC

IOC和DI有什么区别?

IOC就是控制反转,Inversion of control,是面向对象编程的一种设计原则,可以用来减少计算机代码中的耦合度。其中最常见的就是依赖注入,简称DI,还有一种方式叫依赖查找,简称DL。IOC是目标,DI是实现IOC的一种技术手段。

什么叫依赖?

依赖就是A.class中有一个B.class的属性,这就是A依赖B。

注入的两种方法

1.get和set方法;2.构造方法;(在Spring中还提供一种借口注入,到4的时候就被取消了,因为接口注入非常不人性化)

set方法注入在xml中是<bean id="XX" class="XX.xxxx"/>  <bean id="XXX" class="XX.xxxx"> <property name="X" ref="XX"  /> </bean>  这时候需要在XXX类中提供一个setXX的方法,这里ref="XX"就是bean id="XX",如果注入是属性的话,则将ref换成value。

构造方法注入是在xml中是<bean id="XX" class="XX.xxxx"/>  <bean id="XXX" class="XX.xxxx"> <constructor-arg ref="XX"  /> </bean>  这时候需要在XXX类中提供一个构造方法,这里ref="XX"就是bean id="XX",如果注入是属性的话,则将ref换成value。

 有另外两只命名空间:P:XX 和C:XX各种对应上述的property 和constructor-arg 增加命名空间的方法xmlns:p="http://www.springframework.org/schema/p"和 xmlns:c="http://www.springframework.org/schema/c"

如何XML和注解同时使用?

在XML的开通增加context的命名空间:xmlns:context="http://www.springframework.org/schema/context",然后再在xsi:schemaLocation后面增加对应的地址:

http://www.springframework.org/schema/context

https://www.springframework.org/schema/context/spring-context.xsd">

紧接着在xml配置的主体中打开识别注解的开关:<context:annotation-config/>

最后增加扫描注解的路径:<context:component-scanb base-package="XX.XXX"/>,在Spring4版本后,就不需要增加打开识别注解的开关了,只需要这行就可以了。

 

几个注解的意思:

@Configuration:表示增加该注解的类就是XML方式中的xml配置。一般配置在AppConfig中。

@ConponentScan("XX.XX"):表示要扫描XX.XX下的包。一般配置在AppConfig中。

@ImportResource("classpath:Spring.xml"):表示可以在使用注解的同时扫描xml文件中的配置。一般配置在AppConfig中。

 

自动装配:就是由Spring来自动管理各个对象之间的关系;

优点:1.自动装配可以显著减少需要指定属性或构造函数参数;  2.自动装配可以更新一个配置对象演变。例如,如果您需要添加一个类的依赖性,依赖可以满足自动没有你需要修改配置。因此自动装配可以特别有用在开发期间,没有否定的选择切换到代码库时显式连接变得更加稳定

缺点:

自动装配的几种方式:

1.No   2.byName   3.byType   4.constructor

如何加:

1.在XML的xsi:schemaLocation的后面增加default-autowire="byType",byType的时候有可能会匹配到多个,会报异常;如果用的是byName的话,注意这个name指的是set方法后面的名称,例如setXX,则这个name就是XX;

2.可以在XML的bean标签中加,例如<bean id="XX" class="XX.xxxx" autowire=“byName”/> ;

3.在注解中@Autowire是认byType,找不到再根据名称去查找   @Resource(name="XXXX")这@Resource是根据byName,这里是根据属性名称

 

Spring  中的bean的作用域:

@Scopes("singleton")为每个Spring IoC容器将单个bean定义限定为单个对象实例,认下就是singleton

@Scopes("prototype")将单个bean定义的范围限定为任意数量的对象实例。

当我们在singleton中引用了一个prototype bean的时候,并不是prototype失效了,官网的解释是:假设单例bean A需要使用非单例(原型)bean B,可能是在A上的每个方法调用上。容器只创建单例bean A一次,因此只有一次机会设置属性

 

Spring生命周期的回调有三种:

1.实现Spring的接口;InitializingBean disposableBean

2.通过XML来配置;<beanid="exampleInitBean"class="examples.ExampleBean"init-method="init"/>

3.注解;@postconstruct  @PreDestroy

 

depends-on的用法

例如class a和class b没有关系,但是a的一些属性是需要b进行完之后才能拿得到,这时候在Spring加载的过程中就需要先将b进行加载,这就引入了depends-on,如:

<beanid="a"class="A"depends-on="b"/>

<beanid="b"class="B"/>

 

singleton

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。