Spring常用注解
使用注解需要做的配置
用注解来向Spring
容器注册Bean
。需要在applicationContext.xml
中注册<context:component-scan base-package=”pagkage1[,pagkage2,…,pagkageN]”/>
。
如:在base-package
指明一个包
1
|
<context:component-scan base-package="cn.gacl.java"/>
|
表明cn.gacl.java
包及其子包中,如果某个类的头上带有特定的注解[@Component/@Repository/@Service/@Controller
],就会将这个对象作为Bean
注册进Spring
容器。
也可以在<context:component-scan base-package=” ”/>
中指定多个包,如:
1
|
<context:component-scan base-package="cn.gacl.dao.impl,cn.gacl.service.impl,cn.gacl.action"/>
|
@Component
@Component
是所有受Spring
管理组件的通用形式,@Component
注解可以放在类的头上,@Component
不推荐使用。
@Controller
@Controller
对应表现层的Bean
,也就是Action
,例如:
1
|
|
使用@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
,例如:
1
|
|
@Service("userService")
注解是告诉Spring
,当Spring
要创建UserServiceImpl
的的实例时,bean
的名字必须叫做userService
,这样当Action
需要使用UserServiceImpl
的的实例时,就可以由Spring
创建好的userService
,然后注入给Action
,在Action
只需要声明一个名字叫userService
的变量来接收由Spring
注入的userService
即可,具体代码如下:
1
|
// 注入userService
|
注意:在Action
声明的userService
变量的类型必须是UserServiceImpl
或者是其父类UserService
,否则由于类型不一致而无法注入,由于Action
中的声明的userService
变量使用了@Resource
注解去标注,并且指明了其name="userService"
,这就等于告诉Spring
,说Action
要实例化一个userService
,你Spring
快点帮我实例化好,然后给我,当Spring
看到userService
变量上的@Resource
的注解时,根据其指明的name
属性可以知道,Action
中需要用到一个UserServiceImpl
的实例,此时Spring
就会把自己创建好的名字叫做userService
的UserServiceImpl
的实例注入给Action
中的userService
变量,帮助Action
完成userService
的实例化,这样在Action
中就不用通过UserService userService = new UserServiceImpl();
这种最原始的方式去实例化userService
了。如果没有Spring
,那么当Action
需要使用UserServiceImpl
时,必须通过UserService userService = new UserServiceImpl();
主动去创建实例对象,但使用了Spring
之后,Action
要使用UserServiceImpl
时,就不用主动去创建UserServiceImpl
的实例了,创建UserServiceImpl
实例已经交给Spring
来做了,Spring
把创建好的UserServiceImpl
实例给Action
,Action
拿到就可以直接用了。Action
由原来的主动创建UserServiceImpl
实例后就可以马上使用,变成了被动等待由Spring
创建好UserServiceImpl
实例之后再注入给Action
,Action
才能够使用。这说明Action
对UserServiceImpl
类的“控制权”已经被“反转”了,原来主动权在自己手上,自己要使用UserServiceImpl
类的实例,自己主动去new
一个出来马上就可以使用了,但现在自己不能主动去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
就主动注入给他。
@Repository
@Repository
对应数据访问层Bean ,例如:
1
|
|
@Repository(value="userDao")
注解是告诉Spring
,让Spring
创建一个名字叫userDao
的UserDaoImpl
实例。
当Service
需要使用Spring
创建的名字叫userDao
的UserDaoImpl
实例时,就可以使用@Resource(name = "userDao")
注解告诉Spring
,Spring
把创建好的userDao
注入给Service
即可。
1
|
// 注入userDao,从数据库中根据用户Id取出指定用户时需要用到
|
@Autowried
这个注解是对成员变量,方法以及构造函数经行注释的,它默认是byType
方式经行依赖注入。如果当Spring
上下文中存在不止一个UserDao
类型的bean
时,就会抛出BeanCreationException
异常;如果Spring
上下文中不存在UserDao
类型的bean
,也会抛出BeanCreationException
异常。
1
|
@Autowired
|
@Autowried
添加在成员变量上Spring
就会将其以byType
的形式自动化注入到spring
容器中,因此便省去了get/set
方法和Spring
配置文件的配置。@Autowried
注释在成员方法中,Spring
就会把方法的变量将方法的参数注入进来,构造方法的注释同样。默认情况下它要求依赖对象必须存在,如果允许null
值,可以设置它required
属性为false
1
|
@Autowired(required=false)
|
@Qualifer
@Qualifer
标注的对象与上一个相同,不同的是它指定了注入对象的名字,在使用@Autowried
时如果没有指定注入参数的类型就会报错,因此@Qualifer
是对@Autowried
的有益补充。该标签体内需要放的是Bean
注册时写的name
,例如@Service("user.userDao")
,其中user.userDao
就是bean
的name
1
|
|
或者
1
|
@Autowired
|
如果没有指定userDao
的名字的,并且存在另一个名字为userDao
的对象,那么是Spring
就不知道该注入哪一个对象,如果使用@Qualifer
指定注入对象的名字的话就不会出现报错的现象。
如果不存在该对象的话
1
|
|
@Transational
顾名思义就是用于事务控制的。
1
|
/**
|
这是在service
层使用事务的控制,他会有一些参数,我相信大家会明白是什么意思,错误回滚这是事务常用的。
@RequestMapping
@RequestMapping
是定义控制器对应的请求参数的。
1
|
/**
|
@RequestMapping(value = "/login.do")
定义LoginController
的访问地址。
@RequestMapping
@RequestMapping
可以注释在类上也可以住是在方法上,注释在类上是定义该类的访问地址,需要访问其方法时,需要在地址的后面加上?
+方法名
。如果该注解注释在方法上就指定了该方法的访问地址。它是由一些参数,我用到的分别是method -指定请求的类型即GET/POST
。
@ModelAttribute(“account”)
@ModelAttribute("account")
用来绑定表单即指明了这个方法使用的数据是来自account
这个表单的数据,接收数据的对象就是Account
。