Spring是什么?
- Spring是一个产品,里面有很多项目,IOC,AOP是里面的内容,还有MVC、DAO support,tansactions、SpringWebFlux…
IOC
- Inversion of Control控制反转,面试对象编程中的一种设计原则,可以用来降低计算机代码之间的耦合度,其中最常见的方式为依赖注入(Dependency Injection),还有依赖查找(Dependency Lookup)。IOC可称为目标,DI是实现IOC的一种技术手段。
DL依赖查找
- 对象并不是由new创建的,而是由一个程序根据名字找到对应的对象赋值,例如JNDI:DataSource da = (DataSource)ctx.lookup(“java:comp/xxxxx”);
为什么用springIOC?
- 在日常程序开发过程当中,我们推荐面向抽象编程,面向抽象编程会产生类的依赖,管理这些依赖会非常麻烦,假如一类业务需要加事务,我们不把对象交给Spring管理,那么我们就要一个个对象加事务,但是如果我们把对象交给容器管理,我们只需产生添加事务的代理类,便可实现对象事务的添加。 当我们有了一个管理对象的容器之后,类的产生过程也交给了容器,容器在创建对象前后和赋值的时候进行一些操作。
spring实现IOC的思路和方法
- spring实现IOC的思路是提供一些配置信息用来描述类之间的依赖关系,然后由容器去解析这些配置信息,继而维护好对象之间的依赖关系,前提是对象之间的依赖关系必须在类中定义好,比如A.class中有一个B.class的属性,那么我们可以理解为A依赖了B。
spring实现IOC的思路大致可以拆分成3点
- 应用程序中提供类,提供依赖关系(属性或者构造方法)
- 把需要交给容器管理的对象通过配置信息告诉容器(xml、annotation,javaconfig)
- 把各个类之间的依赖关系通过配置信息告诉容器
spring编程的风格
- schemal-based-------xml
- annotation-based-----annotation
- java-based----java Configuration
在代码中提供依赖关系,交给容器维护,容器自动把对象给我们,这个过程称为注入,注入有两种方法:
- 构造方法
- setter方法
spring注入(字符串、数组等)文档:https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#beans-factory-properties-detailed
自动装配
- IOC的注入有两个地方需要提供依赖关系,一是类的定义中,二是在spring的配置中需要去描述。自动装配则把第二个取消了,即我们仅仅需要在类中提供依赖,继而把对象交给容器管理即可完成注入。减少了xml的配置,自动更新配置。
no:不使用自动装配
byName:bean的name是否存在,不存在则等于id。找到对应类的方法中的set方法去掉set将大写转小写。
byType:扫描类的时候,发现类中有依赖,根据依赖类型容器赋值。但是如果存在同一个类型的两个配置,会出现报错。
constructor:根据构造方法
声明方式:全局配置在beans上添加:default-autowire=“byType/byName”,单独配置在bean上添加autowire=“byType/byName”
@Component可以注解到任意Spring管理的类。其他的管理类的注解中有一个@Component。(Spring文档中说明未来可能会有不一样的语义)
@Autowired默认为byType
@Resource默认为ByName( 根据属性名,xml的根据setter方法名)
Bean作用域
单例和原型
使用:@Scope(“singleton/prototype”)
问题:单例对象依赖了原型对象,单例对象只实例化一次,里面的依赖的原型对象只有一次机会设置依赖,所以使用里面的原型对象,都是指向同一个对象。
解决方法一:
类实现ApplicationContextAware接口
解决方法二:
@Lookup
创作不易,转载请注明出处!