1.Bean的生命周期回调
1-1.实现InitalizingBean接口,重写afterpropertiesSet方法
该方法会在对应实现接口的Bean被实例化之后自动调用。但是这种方式和spring的耦合度非常高,严重依赖于spring的某个接口。
1-2.xml文件指定init方法
xml文件注入,在bean标签上写好init属性即可指定对应的init方法。【不推荐】
1-3.@PostConstrut
1-4.其他
1-4-1.depends-on
beanOne当前的一些初始化依靠manager里面的一些东西,但是他们之间没有直接依赖的关系。
1-4-2.lazy加载
一般会使用@Lazy,当然你如果用xml的话,直接在bean标签里面加上去。
1-4-3.filter扫描配置
我们一般会指定一个扫描的路径,但是有时候,一个大路径下面,我们不想要扫描到某个包,这个时候就可以用excludeFilter来排除掉。
先来看看官方文档,注意的是,官方文档的写法:
1-4-3.@Primary
使用@AutoWired的话,如果你注入2个相同类型的bean,那么可以在需要的注入的主类上面加这个注解,这样会默认注入加了@Primary注解的类。
1-4-4.@Qualifier
也是和@Autowired搭配使用,因为@Autowired默认只是使用属性名来做name注入。所以有了这个注解来辅助使用。
1-4-5.加速类的扫描
大型项目中的类是成千上万的,这样扫描出来的类是非常多非常耗时的。所以我们可以引入下面这个依赖,提前给所有要扫描的类加索引。加速扫描。
1-4-6.代替注解
使用java自带的注解,其实也可以用带代替spring的一些注解
2.profile
用法就是直接在bean上面加一个@profile注解,这样的话,我们给对应的环境设置一下,就可以读取到了。
用法如下,加载一个spring容器之后,设置一下环境,设置一下javaconfig文件,重写刷新,启动容器加载即可扫描到对应的profile文件。【如果设定了环境,那么其他bean不会被扫描到】
【如果没设置profile,所有类会被扫描到】
3.整合mybatis
mybatis我们一般不会单独使用,因为单独使用myabtis来操控数据库非常麻烦,而且依赖也非常多,需要opensession等繁琐操作。我们一般会使用mybatis为我们整合号spring的一个依赖,叫做mybatis-spring。mybatis-spring是mybatis为我们优化的,能够无缝和spring整合。把myabtis的很多bean都交给spring来管理,我们就不用手动new出mybatis的各种bean,再交给spring了。
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.3</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.16.RELEASE</version>
4.循环依赖
一般来说,spring使能够解决循环依赖的。他是这样解决循环依赖的:=>
我们假设A和B互相依赖,然后A和B都被加载到内存里面,这个时候先实例化出来,A和B的属性都还没set进去。然后A中有B属性,那么先找到B实例,注入给A。然后找到B,B里面依赖A,把A注入给B,这样就实现了循环依赖了。
但是如果A和B互相依赖,B是一个property的多实例,那么这个循环依赖spring无法自行解决。【为什么property不行,我们后面研究一下源码才能知道】