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"/>
原文:https://www.cnblogs.com/wupangzio/p/10977188.html