1.@Configuration注解
该类等价与XML中配置的beans,相当于IOC容器,它的某个方法的头上如果用了@Bean,则它会作为Spring容器中的bean,与XML配置的bean功能相同
@Configuration注解的类必须使用<context:component-scanbase-package="XXX"/>扫描。如下:
@Configuration
public class ScheduleConfig {
//读取配置文件的值
@Value("${vschedule.port}")
private Integer port;
@Bean
public JobNode jobNodeConfig() {
JobNode node = new JobNode();
node.setDoJobServicePort(port);
node.setAppName("feedback-service");
return node;
}
}
定义一个ScheduleConfig ,用@Configuration注解,那ScheduleConfig 相当于xml里的beans,里面用@Bean注解的和xml里定义的bean等价,用<context:component-scanbase-package=”XXX”/>扫描该类所在的包,最终我们可以在程序里用@AutoWired或@Resource注解取得用@Bean注解的bean,和用xml先配置bean然后在程序里自动注入一样。目的是减少xml里配置
2.@Value注解
为了简化配置文件里取值,可以使用此注解@Value获取配置文件里的值,在spring项目中可以在XML文件中引入文件:
<context:property-placeholder location="classpath*:props/schedule.properties" ignore-unresolvable="true"/>
读取方法为:
//读取配置文件的值
@Value("${vschedule.port}")
private Integer port;
即使给变量赋了初值也会以配置文件的值为准。
3. 用在类上的注解@Controller, @Service, @Repository, @Component
在Spring2.0之前的版本中,@Repository注解可以标记在任何的类上,用来表明该类是用来执行与数据库相关的操作(即dao对象),并支持自动处理数据库操作产生的异常
在Spring2.5版本中,引入了更多的Spring类注解:@Component,@Service,@Controller。@Component是一个通用的Spring容器管理的单例bean组件。而@Repository, @Service, @Controller就是针对不同的使用场景所采取的特定功能化的注解组件。
因此,当你的一个类被@Component所注解,那么就意味着同样可以用@Repository, @Service, @Controller来替代它,同时这些注解会具备有更多的功能,而且功能各异。
最后,如果你不知道要在项目的业务层采用@Service还是@Component注解。那么,@Service是一个更好的选择。
@Controller对应表现层上的Bean,也就是Action,例如:
@Controller
public class TeacherCommentController {
......
}
@Service对应业务层Bean,例如:
@Service
@Scope("prototype")
public class RecommendCourseServiceImpl implements RecommendCourseService {
.....
}
@Scope
注:@Scope("prototype")表示将Action的范围声明为原型,可以利用容器的scope="prototype"来保证每一个请求有一个单独的Action来处理,避免struts中Action的线程安全问题。spring 默认scope 是单例模式(scope="singleton"),这样只会创建一个Action对象,每次访问都是同一Action对象,数据不安全,struts2 是要求每次次访问都对应不同的Action,scope="prototype" 可以保证当有请求的时候都创建一个Action对象
@Repository一般针对数据处理层即dao层,例如:
@Repository
public interface TeacherCommentDao{
public List<TeacherComment> findByTeacherIdAndTimeRange(Map condition);
.......
}
其他网上资料
这几个注解几乎可以说是一样的:因为被这些注解修饰的类就会被Spring扫描到并注入到Spring的bean容器中。
这里,有两个注解是不能被其他注解所互换的:
@Controller
注解的bean会被spring-mvc框架所使用。
@Repository
会被作为持久层操作(数据库)的bean来使用
如果想使用自定义的组件注解,那么只要在你定义的新注解中加上@Component即可:
@Component
@Scope("prototype")
public @interface ScheduleJob {...}
这样,所有被@ScheduleJob
注解的类就都可以注入到spring容器来进行管理。我们所需要做的,就是写一些新的代码来处理这个自定义注解(译者注:可以用反射的方法),进而执行我们想要执行的工作。
@Component
就是跟<bean>
一样,可以托管到Spring容器进行管理。
@Service
, @Controller
, @Repository
= {@Component
+ 一些特定的功能}。这个就意味着这些注解在部分功能上是一样的。
当然,下面三个注解被用于为我们的应用进行分层:
@Controller
注解类进行前端请求的处理,转发,重定向。包括调用Service层的方法
@Service
注解类处理业务逻辑
@Repository
注解类作为DAO对象(数据访问对象,Data Access Objects),这些类可以直接对数据库进行操作
有这些分层操作的话,代码之间就实现了松耦合,代码之间的调用也清晰明朗,便于项目的管理;假想一下,如果只用@Controller
注解,那么所有的请求转发,业务处理,数据库操作代码都糅合在一个地方,那这样的代码该有多难拓展和维护。
总结
@Component
, @Service
, @Controller
, @Repository
是spring注解,注解后可以被spring框架所扫描并注入到spring容器来进行管理
@Component
是通用注解,其他三个注解是这个注解的拓展,并且具有了特定的功能
@Repository
注解在持久层中,具有将数据库操作抛出的原生异常翻译转化为spring的持久层异常的功能。
@Controller
层是spring-mvc的注解,具有将请求进行转发,重定向的功能。
@Service
层是业务逻辑层注解,这个注解只是标注该类处于业务逻辑层。
用这些注解对应用进行分层之后,就能将请求处理,义务逻辑处理,数据库操作处理分离出来,为代码解耦,也方便了以后项目的维护和开发。
注解 | 含义 |
---|---|
@Component | 最普通的组件,可以被注入到spring容器进行管理 |
@Repository | 作用于持久层 |
@Service | 作用于业务逻辑层 |
@Controller | 作用于表现层(spring-mvc的注解) |
4. @PostConstruct 和 @PreDestory
实现初始化和销毁bean之前进行的操作,只能有一个方法可以用此注释进行注释,方法不能有参数,返回值必需是void,方法需要是非静态的。
@PostConstruct:在构造方法和init方法(如果有的话)之间得到调用,且只会执行一次。
@PreDestory:注解的方法在destory()方法调用后得到执行。
5. @Primary
自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常。
6. @Lazy(true)
用于指定该Bean是否取消预初始化,用于注解类,延迟初始化。
6. @Autowired 和 @Resource
1、@Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上。
2、@Autowired默认按类型装配(这个注解是属于spring的),默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,如:
@Autowired(required=false) ,如果我们想使用名称装配可以结合@Qualifier注解进行使用,如下:
Java代码
@Autowired() @Qualifier("baseDao")
private BaseDao baseDao;
3、@Resource 是JDK1.6支持的注解,默认按照名称进行装配,名称可以通过name属性进行指定,如果没有指定name属性,当注解写在字段上时,默认取字段名,按照名称查找,如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。
两者的区别:
@Resource默认按照名称方式进行bean匹配,@Autowired默认按照类型方式进行bean匹配
@Resource(import javax.annotation.Resource;)是J2EE的注解,@Autowired( import org.springframework.beans.factory.annotation.Autowired;)是Spring的注解