Spring的学习
IOC的理论推导
- 在之前程序员写代码,都是service层去调用dao层,这个时候都是一个需求写一个dao接口然后写一个dao的实现类,然后在service去new一个dao层的对象,然后通过这个对象来调用dao实现类的方法。如果此时客户需要增加需求,那么我们就需要再写一个dao层的实现类,然后再service层中去创建新的dao层实现类的对象,也就是修改我们业务层之前new的那个对象的代码,然后调用新的dao实现类的方法,这样每次增加一个需求我们程序员就需要去修改原本的代码,这样的代码是不符合常理的。
- 之后的解决方法就是,我们利用set方法来实现动态的更改,转变为用户需要哪个接口,就用set方法去调用实现类,这是一种思想的转变,从程序员来根据客户的需求选择性的创建对象,转变为由用户自己调用自己想要的对象。这也是sprin的核心思想,控制反转IOC。
- 从最开始程序的主动创建对象是程序员,到后来的程序变成了用户对象的接收者,这种思想从本质上解决了程序的耦合性,更加专注于service层,这就是IOC的原型。
IOC
- IOC也就是spring帮我们创建对象,把所有的对象都交spring,然后在ApplicationContext中配置bean,一个bean就是一个对象,然后通过它的property属性和类中的set方法来进行注入。
- IOC的默认创建参数的模式是无参构造,当然也有有参构造的创建对象方法,此时可以通过下标,类型和参数名三种方式对其进行赋值。
DI
- 构造器注入
- set方法注入
- 依赖:bean对象的创建依赖于容器
- 注入:bean对象中的属性由容器注入
- 其他方式注入
- bean默认是单例模式,也就是说一个ApplicationContext当中的一个对象就只有一个,取出多个来也是同一个地址。作用域单词scope。
Bean的默认装配
- 自动装配是Spring满足bean依赖的一种方式
- Spring会在上下文中寻找,自动给bean装配属性
- 在Spring中有三种自动装配方式
- 在xml中显示的装配
- 在java中显示装配
- 隐式的自动装配(重点)
- @autowired和@Resource的区别
- 都是用来实现自动装配的,但是autowired是通过byName的方式,而且必须要求这个对象存在,后者是默认通过byName的方式,如果name不存在name就会通过byType
Spring中的常用注解
- 1.@Autowire(相当于bean):自动装配注解,通过byName的方式来进行属性的装配,如果给的id和实际id不一样,那我们可以通过@Qualifier(value=“xxx”)来实现。
- 2.@Nullable:如果字段标记了这个注解,那么说明这个字段可以为空
- 3.@Resource:跟Autowire一样是自动装配,但是它会先通过byName的方式,找不到再通过ByType的方式,而且他可以直接再后面加上(value=“xxx”)
- @Component(相当于property):组件注解,把bean交给spring管理,在配置文件中写上scan这个命令后,我们可以在类的上方加一个这个注解表示它是一个组件,它还可以帮我们省略写bean的步骤,等于帮我们创建了一个对象。
- Component注解还有三个衍生注解,为了适配我们的MVC三层架构,在dao层我们一般用@Repository,在service层我们一般用@Service,在Controller层我们一般用@Controller。这四个注解的功能都是一样的,都是将我们的类交给Spring容器。
小结:xml与注解
- xml更加万能,更加灵活,适用于任何场景,维护相对方便
- 注解的话不是自己的类就使用不了,维护起来也相对复杂
- 实践的话一般用xml来管理bean,用注解来实现属性的注入。
- 在使用注解的时候,我们一定要记得让注解生效