返回顶部

Spring注解简介

使用注解之前要开启自动扫描功能,其中base-package为需要扫描的包(含子包)。

<context:component-scan base-package="com.jiang"/>

1、@Component

是所有受Spring 管理组件的通用形式,@Component注解可以放在类的头上,不推荐使用。

Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。

2、@Service

用于标注业务层组件。

3、@Controller

用于标注控制层组件(如struts中的action)。

4、@Repository

用于标注数据访问组件,即DAO组件。

5、@Configuration

作用类似于配置一个spring-bean.xml中的<beans></beans>标签的作用,主要用于Bean的注入,放置在类上。使用该注解注入Bean后,获取IOC容器的方式不再使用ClassPathXmlApplicationContext或者文件系统路径来获取对应的IOC容器,而是使用AnnotationConfigApplicationContext(AnnotationConfiguration.class)的方式来获取IOC容器(AnnotationConfiguration为自定义的配置类)。

6、@Scope

注解是springIoc容器中的一个作用域,在 Spring IoC 容器中具有以下几种作用域:基本作用域singleton(单例)、prototype(多例),Web 作用域(reqeust、session、globalsession),自定义作用域。

singleton单例模式 -- 全局有且仅有一个实例
prototype原型模式 -- 每次获取Bean的时候会有一个新的实例
request -- request表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP request内有效
session -- session作用域表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP session内有效
globalsession -- global session作用域类似于标准的HTTP Session作用域,不过它仅仅在基于portlet的web应用中才有意义

几乎90%以上的业务使用singleton单实例就可以,所以spring默认的类型也是singleton,singleton虽然保证了全局是一个实例,对性能有所提高,但是如果实例中有非静态变量时,会导致线程安全问题,共享资源的竞争,当设置为prototype时:每次连接请求,都会生成一个bean实例,也会导致一个问题,当请求数越多,性能会降低,因为创建的实例,导致GC频繁,gc时长增加


直接在bean对象方法上增加@Scope注解就可以如下:

/**
* 定义一个bean对象
* @return
*/
@Scope
@Bean(value="user0",name="user0",initMethod="initUser",destroyMethod="destroyUser")
public User getUser(){
System.out.println("创建user实例");
return new User("张三",26);
}

7、@Autowired

@Autowired顾名思义,就是自动装配,其作用是为了消除代码Java代码里面的getter/setter与bean属性中的property。当然,getter看个人需求,如果私有属性需要对外提供的话,应当予以保留。

@Autowired默认按类型匹配的方式,在容器查找匹配的Bean,当有且仅有一个匹配的Bean时,Spring将其注入@Autowired标注的变量中。

8、@Qualifier(指定注入Bean的名称)

如果容器中有一个以上匹配的Bean,则可以通过@Qualifier注解限定Bean的名称。

9、@Resource

@Resource默认按名称装配,当找不到与名称匹配的bean才会按类型装配。

@Resource的装配顺序:

(1)、@Resource后面没有任何内容,默认通过name属性去匹配bean,找不到再按type去匹配

(2)、指定了name或者type则根据指定的类型去匹配bean

(3)、指定了name和type则根据指定的name和type去匹配bean,任何一个不匹配都将报错

然后,区分一下@Autowired和@Resource两个注解的区别:

(1)、@Autowired默认按照byType方式进行bean匹配,@Resource默认按照byName方式进行bean匹配

(2)、@Autowired是Spring的注解,@Resource是J2EE的注解,这个看一下导入注解的时候这两个注解的包名就一清二楚了

Spring属于第三方的,J2EE是Java自己的东西,因此,建议使用@Resource注解,以减少代码和Spring之间的耦合。

10、@PostConstruct

注解在方法上,表示此方法是在Spring实例化该Bean之后马上执行此方法,之后才会去实例化其他Bean,并且一个Bean中@PostConstruct注解的方法可以有多个。

11、@PreDestroy

注解在方法上,修饰的方法会在服务器卸载Servlet的时候运行,并且只会被服务器调用一次,类似于Servlet的destroy()方法。被@PreDestroy修饰的方法会在destroy()方法之后运行,在Servlet被彻底卸载之前。

posted @ 2021-12-30 09:39  御用闲人  阅读(121)  评论(0编辑  收藏  举报