Spring 注解详解01

博客原文: http://www.cnblogs.com/xdp-gacl/p/3495887.html

使用注解来构造IoC容器
用注解来向Spring容器注册Bean.
需要在applicationContext.xml中注册
<context:component-scan base-package="pagkage1[, pagkage2, …, pagkageN]"/>.

如:在base-package指明一个包
<context:component-scan base-package="cn.gacl.java"/>
表明cn.gacl.java包及其子包中, 如果某个类的头上带有特定的注解
[@Component/@Repository/@Service/@Controller], 就会将这个对象作为Bean注册进Spring容器.
也可以在<context:component-scan base-package=" "/>中指定多个包, 如:
<context:component-scan base-package="cn.gacl.dao.impl, cn.gacl.service.impl, cn.gacl.action"/>
多个包逗号隔开.

1、@Component
@Component
是所有受Spring 管理组件的通用形式, @Component注解可以放在类的头上, @Component不推荐使用.

2、@Controller
@Controller 对应表现层的Bean, 也就是Action, 例如:
@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的名字.
这里的UserAction还使用了@Scope注解, @Scope("prototype")表示将Action的范围声明为原型,
可以利用容器的scope="prototype"来保证每一个请求有一个单独的Action来处理,
避免struts中Action的线程安全问题.spring 默认scope 是单例模式(scope="singleton"),
这样只会创建一个Action对象, 每次访问都是同一Action对象, 数据不安全,
struts是要求每次次访问都对应不同的Action, scope="prototype" 可以保证当有请求的时候都创建一个Action对象

3、@ 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;

注意:在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就主动注入给他.

4、@ Repository
@Repository对应数据访问层Bean , 例如:
@Repository(value="userDao")
public class UserDaoImpl extends BaseDaoImpl<User> {
………
}
@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<User> userDao;
时间: 2024-10-26 22:24:11

Spring 注解详解01的相关文章

spring注解详解

1. 使用Spring注解来注入属性 1.1. 使用注解以前我们是怎样注入属性的 类的实现: Java代码 public class UserManagerImpl implements UserManager { private UserDao userDao; public void setUserDao(UserDao userDao) { this.userDao = userDao; } ... } public class UserManagerImpl implements Use

【转】Spring注解详解

http://blog.csdn.net/xyh820/article/details/7303330/ 概述 注释配置相对于 XML 配置具有很多的优势: 它可以充分利用 Java 的反射机制获取类结构信息,这些信息可以有效减少配置的工作.如使用 JPA 注释配置 ORM 映射时,我们就不需要指定 PO 的属性名.类型等信息,如果关系表字段和 PO 属性名.类型都一致,您甚至无需编写任务属性映射信息——因为这些信息都可以通过 Java 反射机制获取. 注释和 Java 代码位于一个文件中,而

Spring @注解详解(转)

1.@controller 控制器(注入服务) 2.@service 服务(注入dao) 3.@repository dao(实现dao访问) 4.@component (把普通pojo实例化到spring容器中,相当于配置文件中的<bean id="" class=""/>)   @Component,@Service,@Controller,@Repository注解的类,并把这些类纳入进spring容器中管理. 下面写这个是引入component的

Spring注解详解(转)

概述 注释配置相对于 XML 配置具有很多的优势: 它可以充分利用 Java 的反射机制获取类结构信息,这些信息可以有效减少配置的工作.如使用 JPA 注释配置 ORM 映射时,我们就不需要指定 PO 的属性名.类型等信息,如果关系表字段和 PO 属性名.类型都一致,您甚至无需编写任务属性映射信息——因为这些信息都可以通过 Java 反射机制获取. 注释和 Java 代码位于一个文件中,而 XML 配置采用独立的配置文件,大多数配置信息在程序开发完成后都不会调整,如果配置信息和 Java 代码放

Spring 注解详解03

@Controller @Service @Autowired @RequestMapping @RequestParam @ModelAttribute @Cacheable @CacheFlush @resource @PostConstruct @PreDestroy @repository @component (不推荐使用) @scope @SessionAttributes @InitBinder @Required @qualifier // @Controller 例如 @Con

Spring 注解详解02

原文: http://www.cnblogs.com/digdeep/p/4525567.html spring 的 bean 容器相关的注解: 1) @Autowired 是我们使用得最多的注解, 其实就是 autowire=byType 就是根据类型的自动注入依赖(基于注解的依赖注入), 可以被使用在属性域, 方法, 构造函数上. 2) @Qualifier 就是 autowire=byName, @Autowired 注解判断多个bean类型相同时, 就需要使用 @Qualifier("x

Spring中常用的配置和注解详解

一.  Spring中常用的配置文件详解 Spring中的配置文件详解 1.<!-- 配置注解bean的扫描路径 该配置表示从cn包下开始扫描--> <context:component-scan base-package="cn"></context:component-scan> 2.<!-- 加载资源文件 其中Location表示从哪个路径加载配置文件properties--> <context:property-placeh

Spring IoC详解

Spring IoC详解 1. 控制反转 控制反转是一种通过描述(XML或者注解)并通过第三方去产生或获取特定对象的方式.在Spring中实现控制反转的是IoC容器,其实现方法是依赖注入(Dependency Injection, DI). 它最大的好处是降低对象之间的耦合度,在一个系统中有哪些类,具体如何实现并不需要去理解,只需要知道它有什么用就可以.只是这里对象的产生依赖于IoC 容器,而不是开发者主动的行为.主动创建的模式,责任归于开发者,而在被动模式下,责任归于IoC容器,基于这样的被动

Java基础13:反射与注解详解

Java基础13:反射与注解详解 什么是反射? 反射(Reflection)是Java 程序开发语言的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性. Oracle官方对反射的解释是 Reflection enables Java code to discover information about the fields, methods and constructors of loaded classes, and to use reflected fi