您好,欢迎来到华拓科技网。
搜索
您的当前位置:首页Java开发常用的几个注解

Java开发常用的几个注解

来源:华拓科技网
Java开发常⽤的⼏个注解

Java开发常⽤的注解有@Mapper @Repository(持久层)、@Service(业务层)、@Controller (控制层)和 @Componen(其它),以及@Autowired 和@Resource

@Mapper

从mybatis3.4.0开始加⼊了@Mapper注解,添加@Mapper注解的接⼝⽣成⼀个实现类,⽬的就是为了不再写mapper映射⽂件, 把mapper这个DAO交給Spring管理。

@Repository

@Repository对应数据访问层Bean ,例如:

@Repository(value=\"userDao\")

public class UserDaoImpl extends BaseDaoImpl { ………}

@Repository(value=\"userDao\")注解是告诉Spring,让Spring创建⼀个名字叫“userDao”的UserDaoImpl实例。

当Service需要使⽤Spring创建的名字叫“userDao”的UserDaoImpl实例时,就可以使⽤@Resource(name = \"userDao\")注解告诉Spring,Spring把创建好的userDao注⼊给Service即可。

// 注⼊userDao,从数据库中根据⽤户Id取出指定⽤户时需要⽤到 @Resource(name = \"userDao\") private BaseDao userDao;

@Controller

@Controller对应表现层的Bean,也就是Action,例如:

@Controller

@Scope(\"prototype\")

public class UserAction extends BaseAction{ ……}

使⽤@Controller注解标识UserAction之后,就表⽰要把UserAction交给Spring容器管理,在Spring容器中会存在⼀个名字为\"userAction\"的action,这个名字是根据UserAction类名来取的。注意:如果@Controller不指定其value【@Controller】,则默认的bean名字为这个类的类名⾸字母⼩写,如果指定value【@Controller(value=\"UserAction\")】或者【@Controller(\"UserAction\")】,则使⽤value作为bean的名字。这⾥的UserAction还使⽤了@Scope注解,@Scope(\"prototype\")表⽰将Action的范围声明为原型,可以利⽤容器的scope=\"prototype\"来保证每⼀个请求有⼀个单独的Action来处理,避免struts中Action的线程安全问题。spring 默认scope 是单例模式(scope=\"singleton\"),这样只会创建⼀个Action对象,每次访问都是同⼀Action对象,数据不安全,struts2 是要求每次次访问都对应不同的Action,scope=\"prototype\" 可以保证当有请求的时候都创建⼀个Action对象

@Service

@Service对应的是业务层Bean,例如:

@Service(\"userService\")

public class UserServiceImpl implements UserService { ………}

@Service(\"userService\")注解是告诉Spring,当Spring要创建UserServiceImpl的的实例时,bean的名字必须叫做\"userService\",这样当Action需要使⽤UserServiceImpl的的实例时,就可以由Spring创建好的\"userService\",然后注⼊给Action:在Action只需要声明⼀个名字叫“userService”的变量来接收由Spring注⼊的\"userService\"即可,具体代码如下:

// 注⼊userService

@Resource(name = \"userService\") private UserService userService;

但现在⾃⼰不能主动去new“UserServiceImpl”类的实例,new“UserServiceImpl”类的实例的权⼒已经被Spring拿⾛了,只有Spring才能够new“UserServiceImpl”类的实例,⽽Action只能等Spring创建好“UserServiceImpl”类的实例后,再“恳求”Spring把创建好

的“UserServiceImpl”类的实例给他,这样他才能够使⽤“UserServiceImpl”,这就是Spring核⼼思想“控制反转”,也叫“依赖注⼊”,“依赖注⼊”也很好理解,Action需要使⽤UserServiceImpl⼲活,那么就是对UserServiceImpl产⽣了依赖,Spring把Acion需要依赖的

UserServiceImpl注⼊(也就是“给”)给Action,这就是所谓的“依赖注⼊”。对Action⽽⾔,Action依赖什么东西,就请求Spring注⼊给他,对Spring⽽⾔,Action需要什么,Spring就主动注⼊给他。

@Component

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

@Resource和@Autowired

@Resource和@Autowired都是做bean的注⼊时使⽤,其实@Resource并不是Spring的注解,它的包是javax.annotation.Resource,需要导⼊,但是Spring⽀持该注解的注⼊。1、共同点

两者都可以写在字段和setter⽅法上。两者如果都写在字段上,那么就不需要再写setter⽅法。2、不同点

@Autowired注解是按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。如果我们想使⽤按照名称(byName)来装配,可以结合@Qualifier注解⼀起使⽤(@Service注解必须写名字)。如下:

public class TestServiceImpl { @Autowired

@Qualifier(\"userDao\") private UserDao userDao; }

@Resource

@Resource默认按照ByName⾃动注⼊,由J2EE提供,需要导⼊包javax.annotation.Resource。@Resource有两个重要的属性:name和type,⽽Spring将@Resource注解的name属性解析为bean的名字,⽽type属性则解析为bean的类型。所以,如果使⽤name属性,则使⽤byName的⾃动注⼊策略,⽽使⽤type属性时则使⽤byType⾃动注⼊策略。如果既不制定name也不制定type属性,这时将通过反射机制使⽤byName⾃动注⼊策略。

public class TestServiceImpl {

// 下⾯两种@Resource只要使⽤⼀种即可 @Resource(name=\"userDao\") private UserDao userDao; // ⽤于字段上

@Resource(name=\"userDao\")

public void setUserDao(UserDao userDao) { // ⽤于属性的setter⽅法上 this.userDao = userDao; }}

注:最好是将@Resource放在setter⽅法上,因为这样更符合⾯向对象的思想,通过set、get去操作属性,⽽不是直接去操作属性。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo6.cn 版权所有 赣ICP备2024042791号-9

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务