@Autowired//默认按type注入 @Qualifier(“cusInfoService”)//一般作为@Autowired()的修饰用
@Resource(name=“cusInfoService”)//默认按name注入,可以通过name和type属性进行选择性注入
一般@Autowired和@Qualifier一起用,@Resource单独用。
当然没有冲突的话@Autowired也可以单独用
这三个是根据实际情况来使用的,通常使用@Autowired和@Resource多一些,bean的名字不用写,而UserServiceImpl上面能会这样写 @Service(“userService”)。是整个项目设计时候考虑的情况,如果架构设计师考虑的比较精细,要求比较严格,要求项目上线后的访问速度比较好,通常是考虑速度了。这个时候@Autowired没有@Resource好用,因为@Resource可以根据名字来搜索,是这样写的@Resource(“userService”)。不使用@Autowired @Qualifie(“userService”) 的原因很简单,有点长,不喜欢,增加工作量。因为根据名字搜索是最快的,就像查数据库一样,根据Id查找最快。因为这里的名字与数据库里面的ID是一样的作用。此时工作量自然就增加了。而如果不用注解,用xml文件的时候,对于注入Bean的时候要求写一个Id,xml文件时候的id就相当于这里的名字。
通常情况一个Bean的注解写错了,会报下面这些错误,最为常见,No bean named ‘user’ is defined,这个表示没有找到被命名为user的Bean,通俗的说,就是名字为user的类型,以及它的子类型,出现这个错误的原因就是注入时候的类型名字为user,而搜索的时候找不到,也就是说可能那个搜索的类型,并没有命令为user,解决办法就是找到这个类型,去命令为user,
下面这个错误也常见,No qualifying bean of type [com.service.UserService] found for dependency: 这个错误的原因就是类型上面没有加@Service这个注入,不仅仅是@Service,如果是其他层也会出现这个错误,这里我是以Service为例子说明,如果是DAO层就是没有加@Repository,Controller层,则是没有加@Controller。
还有,如果还想再简单点,无论是DAO,Controller,Service三个层,都可以用这个注解,@Component,这个注解通用所有的Bean,但是使用的人比较少,因为 MVC 的分层设计原则,用@Repository,@Service,@Controller,这个可以区别 MVC 原则中的DAO,Service,Controller。便于识别。
-----------常用注解--------
–定义Bean的注解
@Controller
@Controller(“Bean的名称”)
定义控制层Bean,如Action
@Service
@Service(“Bean的名称”)
定义业务层Bean
@Repository
@Repository(“Bean的名称”)
定义DAO层Bean
@Component
定义Bean, 不好归类时使用.
–自动装配Bean (选用一种注解就可以)
@Autowired (Srping提供的)
默认按类型匹配,自动装配(Srping提供的),可以写在成员属性上,或写在setter方法上
@Autowired(required=true)
一定要找到匹配的Bean,否则抛异常。 默认值就是true
@Autowired
@Qualifier(“bean的名字”)
按名称装配Bean,与@Autowired组合使用,解决按类型匹配找到多个Bean问题。
@Resource JSR-250提供的
默认按名称装配,当找不到名称匹配的bean再按类型装配.
可以写在成员属性上,或写在setter方法上
可以通过@Resource(name=“beanName”) 指定被注入的bean的名称, 要是未指定name属性, 默认使用成员属性的变量名,一般不用写name属性.
@Resource(name=“beanName”)指定了name属性,按名称注入但没找到bean, 就不会再按类型装配了.
@Inject 是JSR-330提供的
按类型装配,功能比@Autowired少,没有使用的必要。
–定义Bean的作用域和生命过程
@Scope(“prototype”)
值有:singleton,prototype,session,request,session,globalSession
@PostConstruct
相当于init-method,使用在方法上,当Bean初始化时执行。
@PreDestroy
相当于destory-method,使用在方法上,当Bean销毁时执行。
–声明式事务
@Transactional