使用java代码配置的基本格式
![](https://img.haomeiwen.com/i752311/c6fc8beff54e0c80.png)
如果不配置bean的名字,默认是方法名。
可以使用如下格式指定bean的名字:
![](https://img.haomeiwen.com/i752311/57029ca23d0e1f00.png)
使用工厂Bean创建bean
Runnable
的工厂bean:
![](https://img.haomeiwen.com/i752311/fb3f37f44cf848d4.png)
配置的是RunnableFactoryBean
:
![](https://img.haomeiwen.com/i752311/20743b13d76669c9.png)
看看怎么使用:
获取RunnableFactoryBean
创建的Runnable
的bean:
![](https://img.haomeiwen.com/i752311/bf82fb2bc22a3ae9.png)
如果需要获取RunnableFactoryBean
工厂bean本身:
![](https://img.haomeiwen.com/i752311/6b9a613ae0493155.png)
不需要实现FactoryBean
如何实现工厂bean
下面是CatFactory
,可以看到该工厂没有实现任何接口,这样就跟spring解耦了:
![](https://img.haomeiwen.com/i752311/2a4b3fb439a2ca71.png)
如何配置:
![](https://img.haomeiwen.com/i752311/13ba5ec6fd554d25.png)
首先需要创建
CatFactory
工厂本身,然后由于自动装配,使用该工厂去创建Cat
。
bean的Scope
![](https://img.haomeiwen.com/i752311/d20132b0dfe25f6f.png)
默认bean都是单例,如果需要每次获取都创建一个新的bean,可以进行如上配置。
bean创建之后和销毁之前需要进行定制——实现接口
![](https://img.haomeiwen.com/i752311/524998b6dd5abfc5.png)
上面实现了两个接口
InitializingBean
,DisposableBean
。
bean创建之后和销毁之前需要进行定制——不实现接口
只是单纯的一个java类,注意@Component
,由于我使用的是java代码配置的方式,我不是使用扫描的方式,所以对于我来说是没有任何作用的。
![](https://img.haomeiwen.com/i752311/bdea4991cbaeaaa2.png)
使用
@Bean
的initMethod
,destroyMethod
:![](https://img.haomeiwen.com/i752311/1885744637890454.png)
bean创建之后和销毁之前需要进行定制——不实现接口使用注解
下面使用了@PostConstruct
和@PreDestroy
注解,请注意为什么@Component
是无效的,而@PostConstruct
和@PreDestroy
是有效的:
![](https://img.haomeiwen.com/i752311/f6479d465e26a58d.png)
下面同样是java配置生成bean的方法:
![](https://img.haomeiwen.com/i752311/694a06f38ddeccd2.png)
以上代码是如何组织起来的
如果是在java代码中配置,则全部都是写在MyConfig
该类中。而在AnnotationConfigApplicationContext
如下书写:
![](https://img.haomeiwen.com/i752311/b6a48309fa433757.png)
之前提到的@Component
配置无效,怎么让它生效呢?
把加了@Component
注解的类也放到AnnotationConfigApplicationContext
参数中。
当然也可以采用扫描的方式。
![](https://img.haomeiwen.com/i752311/a1387ef0749d02fc.png)
spring提供的四种bean注解
这四种bean的作用都是一样的,区别只是语义上的:
@Component
![](https://img.haomeiwen.com/i752311/a54b28ec86e00a42.png)
@Repository
放在Dao层:
![](https://img.haomeiwen.com/i752311/d08667da84f75af4.png)
@Service
放在服务层上:
![](https://img.haomeiwen.com/i752311/f406dcee5f0144e0.png)
@Controller
注解放在控制器上:
![](https://img.haomeiwen.com/i752311/b7eb474728fe2b62.png)
装配的三种方式
![](https://img.haomeiwen.com/i752311/b5297492ad5fbee6.png)
前面两种都spring自带的,不用引入新的jar包。
但是最后一种是java某个标准的,需要引入新包:
![](https://img.haomeiwen.com/i752311/6c8cc77a72d8889a.png)
实例化AnnotationConfigApplicationContext
的几种方式
传递需要扫描的包:
![](https://img.haomeiwen.com/i752311/a90636c03ea47c5a.png)
传递java配置类:
![](https://img.haomeiwen.com/i752311/4bb4fe5cd3b2ef89.png)
可以在java配置类中设置扫描的包
![](https://img.haomeiwen.com/i752311/15045e9e912a9ca1.png)
上面配置了排除,请注意实例化AnnotationConfigApplicationContext
时候参数是PackageScan.class
。但是在com.test.spring4.spring4_test_1
包下还有MyConfig
类:
![](https://img.haomeiwen.com/i752311/c9122ff9db57777b.png)
需要注意PackageScan.class
中配置的排除,排除不了MyConfig
中配置的。
网友评论