目录
前言:
五大类注解
@Controller
@Service
@Repository
@Component
@Configuration
JavaEE标准分层
阿里分层结构
BeanName命名规则
方法注解
@Bean
注入方式取Bean
属性注入
Setter注入
构造方法注入
@Resource
前言:
使用Spring容器,为我们程序开发带来了很大的遍历。那么我们就需要学习Spring带来的一些机制,灵活的使用和理解这些机制,相信会有很多收获。
五大类注解
@Controller
控制器,验证用户请求数据的正确性(安保系统)。直接和前端打交到,验证前端发来请求是否正确。
@Service
服务,编排和调度具体执行方法的(客服中心)。不会直接操作数据库,根据请求判断具体调用哪个方法。
@Repository
数据持久层,直接和数据库交互(执行者)(DAO层 data access object)
@Component
组件(工具类)。为整个项目存放一些需要使用的组件,放在其他位置不是很合适。
@Configuration
配置项(项目中的一些配置)。当项目启动时,如果遇到哪个类被这个注解修饰,那么就会加载其中的一些配置。
注意:
1)上述五大类注解,xml配置的路径中只要能查找到(递归查询),其所修饰的类都会作为bean存储到spring中(类名需不同)。当然如果没有上述五大类注解那么当前类是不能作为bean存储到spring中的。
2)五大类注解存在不同含义,当我们看到某一个注解就可以明确这个了类是做什么的。
3)除了Component以外的其他四大类注解,都有Component注解的功能,也就是它的扩展。(看源码可发现其他四大类注解上面都有@Component注解)。
JavaEE标准分层
阿里分层结构
注意:阿里分层结构是对JavaEE标准分层在服务层(Service)做了一个扩展。
BeanName命名规则
注意:
逐级向下看源码,发现Spring中使用的jdk中的方法来作为BeanName的命名规则。
1)默认是第一个字母小写。
2)如果前两个字母的大写,即BeanName就是原类名。
方法注解
@Bean
注意:
1)可以将方法的返回值添加到spring中。
2)方法注解必须搭配类注解使用,spring不会扫描所有类的方法,只扫描类注解下的方法(提升效率)
3)@Bean的命名规则,默认是方法名,也可以起多个名字(name属性),这个时候默认的名字就无效了
4)控制注入顺序(@Order注解)值越大,注入越迟,是类注解。如果对象一样,名字也一样(覆盖式注入)
注入方式取Bean
@Autowired
属性注入
属性注入(spring会自动的将spring对象注入到@Autowired修饰的属性这里)
根据类型和名字(spring中的对象Id),来确定唯一的一个对象,
优点:
使用非常简单,只需要在属性上加@Autowired注解即可。
缺点:
1)无法实现final修饰的变量注入
2)兼容不好,只适用于IoC容器
3)风险:因为写法简单,所以违背单一设计原则概率更大(可以注入多个对象,使用多个属性)
Setter注入
Setter注入(使用set方法,spring会将对象传入到set方法中)(根据类名和对象名来确定)
优点:
符合单一设计原则(每个方法只能传递一个对象)
缺点:
1)不能注入不可变对象(final修饰)
2)使用Setter注入的对象可能会被修改(可以调用set方法进行修改参数)
构造方法注入
构造方法注入(官方推荐的做法),使用构造方法。
如果只有一个构造方法,可以省略@Autowired,有多个构造方法就不能省略了。
优点:
1)可以注入不可变对象(final修饰的)。
2)注入的对象不会改变,构造方法只执行一次。
3)构造方法可以保证对象完全被初始化(类加载时就会执行)。
4)通用性更好。
提出问题:
为什么构造方法可以注入不可变的对象而Setter和属性注入却不可以呢?
答:final修饰的对象需要直接赋值或者在构造方法里进行初始化。类加载过程中就会执行构造方法,那么就可以初始化final修饰的对象。而Setter注入和属性注入是spring实现的,执行时机在类加载之后,所以就不能修改final修饰的对象。
@Resource
使用JDK 提供的的@Resource注解也可以实现对象的注入。
注意:
1)出身不同:@Autowired 来自于 Spring,而@Resource 来自于 JDK 的注解
2)使用时设置的参数不同:相比于 @Autowired 来说,@Resource ⽀持更多的参数设置,例如name 设置,根据名称获取 Bean。
3)@Autowired 可用于 Setter 注入、构造函数注⼊和属性注入,而@Resource 只能用于 Setter 注入和属性注入,不能用于构造函数注入
4)@Autowired先根据类型查找,之后再根据名称查找。
5)@Resource先根据名称查找,再根据类型查找。
小结:
使用五大类注解和Bean的更简单存储可以快速提升我们开发的效率,学习框架我们要理解框架的本质作用。