1.为什么要使用spring注释?
传统的spring框架是使用.xml配置文件读取JavaBean的定义信息或者配置AOP和事物,这样如果开发中
的JavaBean类众多,那么.xml配置文件要配置的内容很多。
解决方法:spring引入了注释,通过"@XXX"的方式,让注释与Java Bean紧密结合,减少了配置文件的
书写,又增加了Java Bean的可读性与内聚性。
2.Spring注释有哪些?作用是什么?
2.1 @Controller注释
- @Controller注释对应表现层的Bean,也就是Action,使用@Controller注解标识Action以后,就表示把Action交给
Spring容器管理。@Controller用于标记一个类上,使用它标记的类是一个SpringMVC Controller对象。分发处
理器将会扫描使用了该注释的类的方法,并检测该方法是否使用@RequestMapping注释。
@Controller
@Scope("prototype")
public class UserAction extends BaseAction<User>{
……
}
使用@Controller注解标识UserAction之后,就表示要把UserAction交给Spring容器管理,在Spring容器中会存在一个名字为"userAction"的action,这个名字是根据UserAction类名来取的。注意:如果@Controller不指定其value【@Controller】,则默认的bean名字为这个类的类名首字母小写,如果指定value【@Controller(value="UserAction")】或者【@Controller("UserAction")】,则使用value作为bean的名字。
- 单单使用@Controller标记在一个类上,还不能真正意义上的说它就是一个SpringMVC的一个控制器类。因为这
时候Spring还不认识它,那么要如何做Spring才能认识它呢?这个时候就需要我们把这个控制器类交给spring来
管理。
有两种方式可以把控制器类(例如这个控制类是MyController)交给Spring管理,可以让它能够识别我们标记
的@Controller!
1.在SpringMVC的配置文件中定义MyController的bean对象
<bean class="com.host.app.web.controller.MyController"/>
2.在SpringMVC的配置文件中告诉哪里会找标记为@Controller的Controller控制器
<context: component-scan base-package="com.host.app.web.controller">
<context: exclude-filter type="annotation" expression="org.springframework.web."/>
</context: component-scan>
2.2 @RequestMapping注释(属于SpringMVC)
@RequestMapping注释是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。
上面说了@Controller只是定义了一个控制器类,而使用@RequestMapping注释的方法才是真正处理请求的处理器。
例如:
@RequestMapping("/showView")标记在Controller方法上,表示请求/showView.do的时候访问的是MyController的showView方法,该方法返回了一个包含Model和View的ModelAndView对象。
2.3 @Autowired注释
@Autowired,顾名思义,就是自动装配,其作用是为了消除Java代码里面的getter/setter与bean属性中的property。当然,getter看个人需求,如果私有属性需要对外提供的话,应当予以保留。
@Autowired默认按类型匹配的方式,在容器查找匹配的Bean,当有且仅有一个匹配的Bean时,Spring将其注入@Autowired标注的变量中。
例如:
你要在userService里面要做一个userDao的setter/getter方法
如果你使用@Autowired注释,只需要在userService的实现类中声名即可:
@Autowired
private IUserDao userDao;
使用@Autowired的原理是什么?
其实在启动Spring IOC时,容器自动装载了一个AutowiredAnnotationBeanPostProcessor后置处理器,当容器扫描到@Autowired时,就会自动在IOC容器中查找需要的bean,并装配该对象的属性。
在使用@Autowired注释时首先在容器中查询对应类型的bean
1.如果查询结果刚好一个,就将该Bean装配给@Autowired指定的数据
2.如果查询的结果不止一个,那么@Autowired会根据名称查找
3.如果查询结果不为空,那么会抛出异常,解决办法: 使用required=false
2.4 @Service注释
@Service注释,用于标注业务层组件
@Service("userService")注释是告诉Spring,当Spring要创建userServiceImpl的实例时,bean的名字必须叫做"userService",这样,当Action需要使用userServiceImpl实例时,就可以由Spring创建好的"userService",然后注入给Action。
2.5 @Repository注释
@Repository注释,用于标注持久层组件
@Repository(value="userDao")告诉Spring,让Spring创建一个名字叫"userDao"的userDaoImpl实例时,创建好的"userDao"注入给service。
我们在没有用注释的,写Spring配置文件的时候,会在Spring配置文件中定义Dao层的bean,这样,我们在
service层中,写setDao方法,就可以直接通过接口调用Dao层。
1.只需要在Dao实现类中加入
@Repository
public class TestDaoImpl(){
........
}
2.在service层定义
@Autowired
public TestDao testDao;
(不需要写setDao方法,就可以通过接口调用Dao了!)
3.在service层加入
@Service
public class TestService(){
........
}
4.在Action层直接写
@Controller
public class TestAction(){
.......
}
2.6 @Component注释
@Component注释,当组件不好归类的时候,就使用这个注释进行标注
2.7 @Resource注释
@Resource注释,可以标注在字段或属性的setter方法上,但它默认按名称装配,名称可以通过@Resource的name属性指定,如果没有指定name属性,当注释标注在字段上,即默认取字段的名称作为bean名称寻找依赖对象。
2.8 @ResponseBody注释
@ResponseBody注释的作用是将@Controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到
response对象的body区,通常用来返回JSON数据或者是XML数据,需要注意的是,使用此注释之后不会再走视图处理器,
而是直接将数据写入输入流中。
一般在异步获取数据时使用,在使用@RequestMapping后,返回值同城解析为跳转路径,加上@ResponseBody后,返回
结果不会解析为跳转路径,而是直接写入HTTP response body中。比如,异步获取json数据,加上@ResponseBody,会直接返回json数据。