Spring注解
Spring的一个核心功能是IOC,就是将Bean初始化加载到容器中,Bean是如何加载到容器的,可以使用Spring注解方式或者Spring XML配置方式。
Spring注解方式减少了配置文件内容,更加便于管理,并且使用注解可以大大提高了开发效率!
一、 组件类注解
注解方式将Bean的定义信息和Bean实现类结合到一起
@Component:实现Bean组件定义
@Repository:用于标注Dao雷
@Service:用于标注业务类
@Controller:用于标注控制器类
这些都是注解在平时的开发过程中出镜率极高,@Component、@Repository、@Service、@Controller实质上属于同一类注解,用法相同,功能相同,区别在于标识组件的类型。@Component可以代替@Repository、@Service、@Controller,因为这三个注解是被@Component标注的。
举例详解
@Component
@Component
public class Student {
private String name;
}
当一个组件代表数据访问层(DAO)的时候,我们使用**@Repository**进行注解
@Repository
public class HappyDaoImpl implements HappyDao{
private final static Logger LOGGER = LoggerFactory.getLogger(HappyDaoImpl .class);
public void club(){
}
}
当一个组件代表业务层时,我们使用**@Service**进行注解
@Service(value="goodClubService")
//使用@Service注解不加value ,默认名称是clubService
public class ClubServiceImpl implements ClubService {
@Autowired
private ClubDao clubDao;
public void doHappy(){
//do some Happy
}
}
当一个组件作为前端交互的控制层,使用**@Controller**进行注解
@Controller
public class HappyController {
@Autowired //下面进行讲解
private ClubService clubService;
// Control the people entering the Club
// do something
}
/*Controller相关的注解下面进行详细讲解,这里简单引入@Controller*/
总结注意点
1、被注解的java类当做Bean实例,Bean实例的名称默认是Bean类的首字母小写,其他部分不变。@Service也可以自定义Bean名称,但是必须是唯一的!
2、尽量使用对应组件注解的类替换@Component注解,在spring未来的版本中,@Controller,@Service,@Repository会携带更多语义。并且便于开发和维护!
3、指定了某些类可作为Spring Bean类使用后,最好还需要让spring搜索指定路径,在Spring配置文件加入如下配置:
<!-- 组件扫描器,用于在指定的包中扫描你定义的注解
base-package属性:值是包名,容器启动会扫描保重以及子包中的注解
-->
<context:component-scan base-package="cn.lexed.pojo"></context:component-scan>
二、装配bean时常用的注解
1、注解介绍
@Autowired:属于Spring 的org.springframework.beans.factory.annotation包下,可用于为类的属性、构造器、方法进行注值
@Resource:不属于spring的注解,而是来自于JSR-250位于java.annotation包下,使用该annotation为目标bean指定协作者Bean。
@PostConstruct 和 @PreDestroy 方法 实现初始化和销毁bean之前进行的操作
举例说明
@Autowired
@Component("stu")
public class Student {
@Value("李四")
private String name;
@Value("21")
private int age;
@Autowired
/*@Qualifier("scc")*/
private School sc;
}
1.在对象类型上使用@Autowired,该注解默认使用,按类型自动装配Bean的方式
2.联合使用@Autowired与@Qualifier.
@Autowired的value属性用于指定要匹配的Bean的id值
@Resource
public class AnotationExp {
@Resource(name = "HappyClient")
private HappyClient happyClient;
@Resource(type = HappyPlayAno .class)
private HappyPlayAno happyPlayAno;
}
JDK注解@Resource:自动注入
Spring提供了对jdk中@Resource注解的支持
@Resource:可以按名称匹配也可以按照类型匹配默认按名称匹配
总结
1):相同点
@Resource的作用相当于@Autowired,均可标注在字段或属性的setter方法上。
(2):不同点
a:提供方 @Autowired是Spring的注解,@Resource是javax.annotation注解,而是来自于JSR-250,J2EE提供,需要JDK1.6及以上。
b :注入方式 @Autowired只按照Type 注入;@Resource默认按Name自动注入,也提供按照Type 注入;
c:属性
@Autowired注解可用于为类的属性、构造器、方法进行注值。默认情况下,其依赖的对象必须存在(bean可用),如果需要改变这种默认方式,可以设置其required属性为false。
还有一个比较重要的点就是,@Autowired注解默认按照类型装配,如果容器中包含多个同一类型的Bean,那么启动容器时会报找不到指定类型bean的异常,解决办法是结合**@Qualified**注解进行限定,指定注入的bean名称。
@Resource有两个中重要的属性:name和type。name属性指定byName,如果没有指定name属性,当注解标注在字段上,即默认取字段的名称作为bean名称寻找依赖对象,当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找依赖对象。
需要注意的是,@Resource如果没有指定name属性,并且按照默认的名称仍然找不到依赖对象时, @Resource注解会回退到按类型装配。但一旦指定了name属性,就只能按名称装配了。 d:@Resource注解的使用性更为灵活,可指定名称,也可以指定类型 ;@Autowired注解进行装配容易抛出异常,特别是装配的bean类型有多个的时候,而解决的办法是需要在增加@Qualitied进行限定。
Spring中 @Autowired注解与@Resource注解的区别
注意点:使用@Resource也要注意添加配置文件到Spring,如果没有配置component-scan
<context:component-scan>
<!--<context:component-scan>的使用,是默认激活<context:annotation-config>功能-->
则一定要配置 annotation-config
<context:annotation-config/>