引言
在写项目的时候每次在调用的对象的时候,都需要先导入对应的包和手动实例化这个对象,如果对象少的话还能接收,但是spring提供了更好的解决方式,spring是一个IOC(控制反转)容器,他可以储存对象,在你需要的时候给你注入(DI)这样就免去了你创建对象的操作,在使用的时候只需要使用一个注解就能轻松创建了,而且还能轻松达到解耦的目的
IoC(Inversion of Control 控制反转)
字面意思的理解就是,本来这个类的控制权是在我自己手中,我需要对象的时候就直接给new一个这个对象,然后使用,而控制反转了之后,这个类的控制权在spring手中了,我要使用的时候,需要从spring这个容器中拿,new这个对象的控制权变为了在spring手中了,并通过申明注入(DI)
对象,这样就轻松的实现了解耦合,比如:
一个简单的造车例子,我需要把轮子的尺寸给car,而如果之后的代码需要改变size这个字段的话比如类型改为long,会发现需要改变car的参数,如果car还有嵌套的话就需要改变的更多了,没有达到解耦的目的,而在spring中只需要,将类交给spring管理就要,需要的时候注入
IoC&DI 使用
IoC
使用类注解@Component注解来修饰需要交给spring管理的对象,会将自定义的类型注册成bean,为了更好的分辨不同层的业务,spring提供了更多的类注释
@Controller(表现层),@Service(业务逻辑层),@Repository(数据层),@Configuration(配置层,一般不属于前面的就使用这个来修饰)
这几个注解只有@Controller只能用于表现层不能和其他的替换,且他们都是基于@Component注解的,功能的实现方式都是相同的
@Bean 方法注解
被@Bean修饰的方法的返回值会被spring注册为一个Bean,默认为单例模式,可以通过Bean名字或类型DI注入来获取这个返回值,如果一个类中需要多个对象和注入外面导入的类的没办法提供注释,那么就可以使用bean注解
获取bean对象
在启动之后,会返回整个bean容器,这是就可以通对于的bean的名字或类型来获取bean对象
通过名字来获取bean是需要遵循一定的格式的
* 获取对象的name在获取时需要遵循一定的规则,储存在bean中的对象一律使用小驼峰的格式,如果类名字前俩个字符为大写,那就保持原来的类名字储存 * 比如 储存 HelloWorld 在bean中是 helloWorld 而储存NHello 在bean中是NHello
扫描路径
在启动的时候,spring默认的扫描路径是启动类所在的路径起向下扫描,如果需要更改他的扫描路径可以使用@ComponentScan("xx.xx.xx"),这样才会把你交给spring管理的对象注册到bean中
DI依赖注入
在spring中有三种注入方式 属性注入 构造方式注入 Setter注入
使用@Autowired来注入bean对象
@Autowired 会根据bean的类型来选择注入哪个bean对象,如果在bean中有多个相同类型的对象,直接注入的话spring会不知道要注入那个,比如这种情况
那么就需要我们自己来处理下
@Primary:表示在有相同类型bean的时候注入的是那个bean
注入的是b()这个方法放回的对象
也可以使用 @Qualifier来修改每个bean的名字,他需要和@Autowired配合使用
还可以使用@Resource注解来注入对象,@Resource和@Autowired的最大区别是,@Resource是按bean的名称来注入对象的,而@Autowired是按bean的类型来注入对象的,且@Resourcet提供了更多的参数设置
注入的是名字为b3的bean
@Resource是jdk注解,而@Autowired是spring的注解
Autowired的转配顺序
EDD~~~