Spring注解@Component、@Repository、@Service、@Controller

Spring注解@Component、@Repository、@Service、@Controller

 

@Service用于标注业务层组件

 

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

 

@Repository用于标注数据访问组件,即DAO组件(repository 仓库; 贮藏室; 博物馆; 亲信;)

 

@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。(component 成分; 组分; 零件; [数] 要素;)

 

<context:component-scan base-package="com.msg.service.*"/>

1、component-scan标签默认情况下自动扫描指定路径下的包(含所有子包),将带有@Component、@Repository、@Service、@Controller标签的类自动注册到spring容器。

   对标记了 Spring's @Required、@Autowired、JSR250's @PostConstruct、@PreDestroy、@Resource、JAX-WS's @WebServiceRef、

   EJB3's @EJB、JPA's @PersistenceContext、@PersistenceUnit等注解的类进行对应的操作使注解生效(包含了annotation-config标签的作用)。

   getBean的默认名称是类名(头字母小写),如果想自定义,可以@Service(“aaaaa”)这样来指定。这种bean默认是“singleton”的,如果想改变,可以使用@Scope(“prototype”)来改变。

 

   如果配置了<context:component-scan>那么<context:annotation-config/>标签就可以不用再xml中配置了,因为前者包含了后者。

   你可能会见到<context:annotation-config/>这样一条配置,他的作用是式地向 Spring 容器注册AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor、

   PersistenceAnnotationBeanPostProcessor 以及 RequiredAnnotationBeanPostProcessor 这 4 个BeanPostProcessor。

   注册这4个 BeanPostProcessor的作用,就是为了你的系统能够识别相应的注解。 例如: 如果你想使用@Autowired注解,那么就必须事先在 Spring 容器中声明 AutowiredAnnotationBeanPostProcessor Bean。传统声明方式如下 <bean class="org.springframework.beans.factory.annotation. AutowiredAnnotationBeanPostProcessor "/> 

 

   @Autowired可以对成员变量、方法和构造函数进行标注,来完成自动装配的工作,这里必须明确:@Autowired是根据类型进行自动装配的,如果需要按名称进行装配,则需要配合@Qualifier(当接口存在两个实现类的时候必须使用@Qualifier指定注入哪个实现类)

   @Autowired标注可以放在成员变量上,也可以放在成员变量的set方法上。前者,Spring会直接将UserDao类型的唯一一个bean赋值给userDao这个成员变量;后者,Spring会调用setUserDao方法来将UserDao类型的唯一一个bean装配到userDao这个属性。

2、Use-dafault-filters=”false”的情况下(默认true):<context:exclude-filter>指定的不扫描,<context:include-filter>指定的扫描

 

 

3、Spring的controller默认是单例,

   1) Struts2会对每一个请求,产生一个Action的实例来处理.

   2) Spring的Ioc容器管理的bean默认是单实例的.

 

4、spring bean作用域有以下5个:

   singleton:单例模式,当spring创建applicationContext容器的时候,spring会欲初始化所有的该作用域实例,加上lazy-init就可以避免预处理;

   prototype:原型模式,每次通过getBean获取该bean就会新产生一个实例,创建后spring将不再对其管理;

 

   ====下面是在web项目下才用到的===

   request:搞web的大家都应该明白request的域了吧,就是每次请求都新产生一个实例,和prototype不同就是创建后,接下来的管理,spring依然在监听

   session:每次会话,同上

   global session:全局的web域,类似于servlet中的application

 

   最佳实践:

   1、不要在controller中定义成员变量。

   2、万一必须要定义一个非静态成员变量时候,则通过注解@Scope("prototype"),将其设置为多例模式。

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值