IOC 操作 Bean 管理 (基于注解)
1、什么是注解
- 注解是代码的特殊格式,格式:@注解名称(属性名称=属性值,属性名称=属性值…)
- 使用注解,注解作用在类上面,方法上面,属性上面
- 使用注解的目的:简化xml的配置
2、组件扫描
-
Spring能够从指定的classpath下自动扫描,侦测和实例化具有特定注解的bean
-
方法一 xml形式
<!-- 1 component 组件 2 scan 扫描 3 base-package = "包名" 如果扫描多个包,可以用逗号隔开 可以扫描 包上层路径 --> <context:component-scan base-package=""></context:component-scan>
-
方法二 config类 —— 以类的形式实现组件扫描 SpringConfig.class
@Configuration @ComponentScan(basePackages = {"com.xin"}) public class SpringConfig { }
class TestBean
public class Test { @org.junit.Test public void TestBean_01() { // AnnotationConfigApplicationContext 寻找config类 —— 以类的形式实现组件扫描 ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class); UserXinImpl userXinImpl = context.getBean("userXinImpl", UserXinImpl.class); System.out.println(userXinImpl.toString()); } }
3、Spring 针对 Bean 管理中创建对象提供注解
4个注解功能一样,都可以来创建 bean实例
- @Component —— 普通的注解
- @Service —— service层
- @Controller —— web层
- @Repository —— dao层
4、Spring 注解注入属性
-
@Autowired —— 根据属性类型进行自动装配
-
@Qualifier —— 根据属性名进行注入,必须同 @Autowired 一起使用
Autowired默认先按byType,如果发现找到多个bean,则,又按照byName方式比对,如果还有多个,则报出异常。 1.可以手动指定按byName方式注入,使用@Qualifier。 //通过此注解完成从spring配置文件中 查找满足Fruit的bean,然后按//@Qualifier指定pean @Autowired @Qualifier(“pean”) public Fruit fruit; 2.如果要允许null 值,可以设置它的required属性为false,如:@Autowired(required=false) public Fruit fruit;
-
@Resource —— 根据属性类型、属性名进行注入,默认属性名
默认按 byName自动注入,如果找不到再按byType找bean,如果还是找不到则抛异常,无论按byName还是byType如果找到多个,则抛异常。 @Resource(name="" tpye="") 可以手动指定bean,它有2个属性分别是name和type,使用name属性,则使用byName的自动注入,而使用type属性时则使用byType自动注入。 这个注解是属于J2EE的,减少了与spring的耦合。
————————以上为 对象属性注入
-
@Value —— 基本类型 属性的注入
// @Value 可以引入 properties 格式文件中的数据 @Value(“${wx_appid}”) public String name;
注意:
- @Autowired,@Qualifier 是Spring的注解
- @Resource是javax.annotation注解,而是来自于JSR-250,J2EE提供
5、其他注解
-
@PostConstruct 和 @PreDestory
实现初始化和销毁bean之前进行的操作
-
@PostConstruct:在构造方法和init方法(如果有的话)之间得到调用,且只会执行一次。
-
@PreDestory:注解的方法在destory()方法调用后得到执行。
public class TestService { @PostConstruct public void init(){ System.out.println("初始化"); } @PreDestroy public void dostory(){ System.out.println("销毁"); } }
-
-
@Lazy(true)
用于指定该Bean是否取消预初始化,用于注解类,延迟初始化。
-
@Scope
设置Spring容器如何新建Bean实例(方法上,得有@Bean)
其设置类型包括:- Singleton (单例,一个Spring容器中只有一个bean实例,默认模式),
- Protetype (每次调用新建一个bean),
- Request (web项目中,给每个http request新建一个bean),
- Session (web项目中,给每个http session新建一个bean),
- GlobalSession(给每一个 global http session新建一个Bean实例)
-
@Bean
注解在方法上,声明当前方法的返回值为一个bean,替代xml中的方式(方法上)
-
@Configuration
声明当前类为配置类,其中内部组合了@Component注解,表明这个类是一个bean(类上)
-
@ComponentScan
用于对Component进行扫描,相当于xml中的(类上)
-
@WishlyConfiguration
为@Configuration与@ComponentScan的组合注解,可以替代这两个注解