注解的作用:spring容器是通过把java类注册成bean进行管理的,把java类变成bean有两种方式,一种是通过xml文件进行配置,把需要的类注册成bean,
还有一种方式就是注解,注解的方式只需要在需要的类前边加上注解,spring扫描到注解就能把被注解的类自动注册成bean,不同的注解可以被注册成不同的bean,
相对于xml配置,使用注解更为方便快捷。也因此越来越多的框架都支持注解配置而放弃xml配置。所以总得来说,注解的作用就是代替手动配置吧,只需要在适当的位置标注一下,就能让框架自己完成具体的配置过程。
首先,在applicationContext.xml文件中加一行: <context:component-scan base-package="com.hzhi.clas"/> 加上这一行以后,将自动扫描路径下面的包,如果一个类带了@Service注解,将自动注册到Spring容器,不需要再在applicationContext.xml文件定义bean了,类似的还包括@Component、@Repository、@Controller。 比如下面这个类: 复制代码 @Service("courseDAO") @Scope("prototype") public class CourseDAOImpl extends HibernateDaoSupport implements CourseDAO{ ...... } 复制代码 其作用就相当于applicationContext.xml文件里面的: <bean id="courseDAO" class="com.hzhi.course.dao.CourseDAOImpl" scope="prototype"> ...... </bean>
![](http://static.blog.csdn.net/images/category_icon.jpg)
版权声明:本文为博主原创文章,未经博主允许不得转载。
很长时间没做web项目都把以前学的那点框架知识忘光了,今天把以前做的一个项目翻出来看一下发现用·@Component标记一个组件,而网上有的用@Service标记组件,我晕就查了一下资料:
spring 2.5 中除了提供 @Component 注释外,还定义了几个拥有特殊语义的注释,它们分别是:@Repository、@Service 和 @Controller。
在目前的 Spring 版本中,这 3 个注释和 @Component 是等效的,但是从注释类的命名上,很容易看出这 3 个注释分别和持久层、业务层和控制层(Web 层)相对应。
虽然目前这3 个注释和 @Component 相比没有什么新意,但 Spring 将在以后的版本中为它们添加特殊的功能。
所以,如果 Web 应用程序采用了经典的三层分层结构的话,最好在持久层、业务层和控制层分别采用上述注解对分层中的类进行注释。
@Service用于标注业务层组件
@Controller用于标注控制层组件(如struts中的action)
@Repository用于标注数据访问组件,即DAO组件
@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
- @Service
- public class VentorServiceImpl implements iVentorService {
- }
- @Repository
- public class VentorDaoImpl implements iVentorDao {
- }
在一个稍大的项目中,如果组件采用xml的bean定义来配置,显然会增加配置文件的体积,查找以及维护起来也不太方便。
Spring2.5为我们引入了组件自动扫描机制,他在类路径下寻找标注了上述注解的类,并把这些类纳入进spring容器中管理。
它的作用和在xml文件中使用bean节点配置组件时一样的。要使用自动扫描机制,我们需要打开以下配置信息:
代码
- <?xml version="1.0" encoding="UTF-8" ?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:context="http://www.springframework.org/schema/context"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-2.5.xsd">
- <context:component-scan base-package=”com.eric.spring”>
- </beans>
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”)来改变。
可以使用以下方式指定初始化方法和销毁方法:
- @PostConstruct
- public void init() {
- }
- @PreDestroy
- public void destory() {
- }
注入方式:
把DAO实现类注入到action的service接口(注意不要是service的实现类)中,注入时不要new 这个注入的类,因为spring会自动注入,如果手动再new的话会出现错误,
然后属性加上@Autowired后不需要getter()和setter()方法,Spring也会自动注入。
在接口前面标上@Autowired注释使得接口可以被容器注入,如:
- @Autowired
- @Qualifier("chinese")
- private Man man;
当接口存在两个实现类的时候必须使用@Qualifier指定注入哪个实现类,否则可以省略,只写@Autowired。
用@Resource注解完成属性装配
使用Field注入(用于注解方式):注入依赖对象可以采用手工装配或者手工自动装配。在实际应用中建议使用手工装配,因为自动装配会产生未知情况,开发人员无法预见最终的装配结果。
依赖注入—手工装配
手工装配依赖对象,在这种方式中又有两种编程方式。
1.在xml配置文件中,通过bean节点配置,如:
1 <bean id="orderService" class="cn.itcast.service.OrderServiceBean">
2 //构造器注入
3 <constructor-arg index="0" type="java.lang.String" value="xxx"/>
4 //属setter方法注入
5 <property name="name" value="zhao"/>
6 </bean>
2.在java代码中使用@Autowired或者@Resource注解方式进行装配。但我们需要在xml配置文件中配置一下信息
1 <beans Xmlns="http://www.springframework.org/schema/beans"
2 Xmlns="http://www.w3.org/2001/XMLSchema-instance"
3 Xmlns:context="http://www.springframework.org/schema/context"
4 Xsi:schemaLocation="http://www.springframework.org/schema/beans
5 http://www.springframework.org/schema/context
6 http://www.springframework.org/schema/context/spring-context-2.5xsd">
7 </beans>
这个配置隐式注册了多个对注释进行解析处理的处理器:AutowiredAnnotationBeanPostProcessor,CommonAnnotationBeanPostProcessor
PersistenceAnnotationBeanProcessor,RequiredAnnotationBeanPostProcessor
3.区别
在java代码中使用@Autowired或@Resource注解方式进行装配。这两个注解的区别是@Autowired默认按类型装配@Resource默认按名称进行装配,当找不到与名称匹配的bean才会按类型装配
1 @Autowired
2 private PersonDao personDao;//用于字段上
3 @Autowired
4 public void setOrderDao(OrderDao orderDao){
5 this.orderDao = orderDao; //用于属性的setter方法上
6 }
@Autowired注解是按类型装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它required属性为false;如果我们想使用名称装配,可以结合@Qualfier注解一起使用,如下:
@Autowired@Qualifier("personDao")
private PersonDao personDao;
@Resource注解和@Autowired一样,可以标注在字段或者属性的setter方法上,但它默认按名称装配。名称可以通过@Resource的name属性指定;如果没有指定name属性,当注解标注在字段上,即默认字段的名称作为bean名称寻找依赖对象;当注解标注在属性setter方法上,即默认取属性名作为bean名称寻找依赖对象
@Resource(name="personDaoBean")
private PersonDao personDao;
注:如果没有指定name属性,并且按照默认的名称仍找不到对象时,@Resource注解会回退到按类型装配。但一旦指定了name属性,就只能按名称装配了。
1、@Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上。
2、@Autowired默认按类型装配(这个注解是属业spring的),默认情况下必须要求依赖对象必须存在,如果要允许null 值,可以设置它的required属性为false,如:@Autowired(required=false) ,如果我们想使用名称装配可以结合@Qualifier注解进行使用,如下:
- @Autowired() @Qualifier("baseDao")
- private BaseDao baseDao;
3、@Resource(这个注解属于J2EE的),默认安照名称进行装配,名称可以通过name属性进行指定,
如果没有指定name属性,当注解写在字段上时,默认取字段名进行按照名称查找,如果注解写在setter方法上默认取属性名进行装配。 当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。
- @Resource(name="baseDao")
- private BaseDao baseDao;
我喜欢用 @Resource注解在字段上,且这个注解是属于J2EE的,减少了与spring的耦合。最重要的这样代码看起就比较优雅。
。。。。。。。。。。。。。。。。。。。。。。。。。。。
什么时候用@Resource,什么时候用@service
Spring中什么时候用@Resource,什么时候用@service
当你需要定义某个类为一个bean,则在这个类的类名前一行使用@Service("XXX"),就相当于讲这个类定义为一个bean,bean名称为XXX;
当需要在某个类中定义一个属性,并且该属性是一个已存在的bean,要为该属性赋值或注入时在该属性上一行使用@Resource(name="xxx"),相当于为该属性注入一个名称为xxx的bean。
===================================================================================================
Spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource、@PostConstruct以及@PreDestroy。
@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了。@Resource有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。
@Resource装配顺序
1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
3. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
4. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配;
@RequestMapping():为控制器类或者方法指定一个映射的路径,也就是说控制器类或者方法所对应的url,之后就可以通过@RequestMapping()注解指定的路径来访问到对应的类或方法。使用格式是:
@RequestMapping(value=”/login”)
一般来说,/后边的值保持和类或者方法同名,当然用别的名字也可以。@RequestMapping()还支持使用参数method限定被请求的方式,例如:
@RequestMapping(value="/getName", method = RequestMethod.GET)
, @Controller
用来标记控制类
2, @RequestMapping()
用来标记在controller类上或者方法上,做地址映射
3, @Autowired
注释在成员变量上spring就会将其以Byname的形式自动化注入到spring容器中,因此便省去了get/set方法和spring配置文件的配置
4, @Service
标记业务逻辑层Bean
5, @Resource
这个注解不属于spring,是J2EE的注解;注解与@Autowried的使用方法一样,但是建议使用@Resource。
@Resource与@Autowried的不同就是@Autowried是是通过Bytype的方式注入spring的,而@Resource是通过Byname或Bytype方式注入spring的。@Resource有两个重要的属性分别是name和type,spring将属性name解析为bean的名字,而将type属性解析成bean的类型。如果使用name属性就是使用Byname自动注入策略,如果使用type属性就是使用Bytype自动修护乳策略,如果即不指定name也不指定type,那么spring就通过反射机制使用Byname自动注入策略。如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配(见2);如果没有匹配,则回退为一个原始类型(UserDao)进行匹配,如果匹配则自动装配;
6,@Transational
标记该方法是事务执行的;
7,@Repository
标记数据访问层Bean
Spring系列之Spring常用注解总结
https://www.cnblogs.com/xiaoxi/p/5935009.html
- 推荐文章
- nodejs 上传下载文件
- js 格式化字符串
- js能力提升之路
- js setTimeout 防抖
- android第三方包
- 利用Tomcat搭建服务器
- 第一阶段总结
- 项目日记
- 团队初成立
- 软件工程概论02作业
- 软件工程概论01作业
- 软件工程概论日记
- 多态问题初步学习
- 类和对象
- 课后整理(方法论)
- socket编程学习-------python打造多人聊天室
- socket编程学习-------python打造聊天机器人
- socket编程学习-------套接字概述
- Python爬虫学习(三) ——————爬取外卖信息
- 多线程与多进程(3)
- 多线程与多进程(4)
- 多线程与多进程(2)
- 多线程与多进程(1)
- Python爬虫学习(二) ——————爬取前程无忧招聘信息并写入excel
- python学习之爬虫(一) ——————爬取网易云歌词
- str=str.replaceAll("[^a-zA-Z]+", ""); 与 str=str.replaceAll("^[a-zA-Z]+", ""); ^写在里面和写在外面有什么不同,为什么
- java中<T> T和T的区别?
- redis命令
- Linux压缩当前目录下的所有文件-解压
- 正则