Spring的注解
1.@controller 控制器(注入服务)
2.@service 服务(注入dao)
3.@repository dao(实现dao访问)
4.@component 把普通pojo实例化到bean容器中,相当于:
5.@Autowired 默认按照type装配,默认情况下必须要求依赖对象存在。如果想使用名称装配可以结合@Qualifier注解。如下:
@Autowired() @Qualifier("baseDao")
private BaseDao baseDao;
6.@Resource 默认按照名称进行装配,名称可以通过name属性指定,当找不到与名称匹配的bean时才会按照类型进行匹配。注意:如果name属性一旦指定,就只会按照名称进行装配。
7.@Qualifier注解 :
@Autowired是根据类型进行自动装配的。例如,如果当Spring上下文中存在不止一个UserDao类型的bean时,就会抛出BeanCreationException异常;如果Spring上下文中不存在UserDao类型的bean,也会抛出BeanCreationException异常。我们可以使用@Qualifier配合@Autowired来解决这些问题。
@Autowired
@Qualifier("userServiceImpl")
public IUserService userService;
8.@PostConstruct :
在方法上加入该注解时,这个方法就会在Spring初始化之后被Spring容器执行
9.@PreDestroy:在类销毁之前调用
10.@Configuration:等价于XML中配置的beans,注解类。其方法上如果注册了@Bean,就会作为这个Spring容器中的Bean。
11.@Value:简化从Properties里取配置,如下:
@Value("${wx_appid}")
public String appid;
12.@Primary:自动装配当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者。
13.@Async:
java里使用线程3种方式:
继承Thread类
实现Runnable接口
使用Callable和Future接口创建线程,并能得到返回值
而使用@Async可视为第四种方法,基于@Async标注的方法,称之为异步方法,这个注解用于标注某个方法或某个类里面的所有方法都是需要异步处理的。配置如下:
第二步在类或方法上添加@Async,当调用该方法时,则该方法即是用异步执行的方法单独开个新线程执行。
@Async
public Future testAsyncReturn () {
System.out.println("Execute method asynchronously - "
+ Thread.currentThread().getName());
try {
Thread.sleep(5000);
return new AsyncResult("hello world !!!!");
} catch (InterruptedException e) {
//
}
return null;
}
public void test(){
Future future = cc.testAsyncReturn();
while (true) { ///这里使用了循环判断,等待获取结果信息
if (future.isDone()) { //判断是否执行完毕
System.out.println("Result from asynchronous process - " + future.get());
break;
}
System.out.println("Continue doing something else. ");
Thread.sleep(1000);
}
}
基于java配置的使用异步的方式:
@Configuration
@EnableAsync
public class SpringConfig {
private int corePoolSize = 10;
private int maxPoolSize = 200;
private int queueCapacity = 10;
private String ThreadNamePrefix = "MyLogExecutor-";
@Bean
public Executor logExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(corePoolSize);
executor.setMaxPoolSize(maxPoolSize);
executor.setQueueCapacity(queueCapacity);
executor.setThreadNamePrefix(ThreadNamePrefix);
// rejection-policy:当pool已经达到max size的时候,如何处理新任务
// CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.initialize();
return executor;
}
}
14.@Inject:与@Autowired具有互换性
15.@Singleton:只要在类上加上这个注解,就可以实现一个单例类,不需要自己手动编写单例实现类
*
元注解@Target,@Retention,@Documented,@Inherited
*
* @Target 表示该注解用于什么地方,可能的 ElemenetType 参数包括:
* ElemenetType.CONSTRUCTOR 构造器声明
* ElemenetType.FIELD 域声明(包括 enum 实例)
* ElemenetType.LOCAL_VARIABLE 局部变量声明
* ElemenetType.METHOD 方法声明
* ElemenetType.PACKAGE 包声明
* ElemenetType.PARAMETER 参数声明
* ElemenetType.TYPE 类,接口(包括注解类型)或enum声明
*
* @Retention 表示在什么级别保存该注解信息。可选的 RetentionPolicy 参数包括:
* RetentionPolicy.SOURCE 注解将被编译器丢弃
* RetentionPolicy.CLASS 注解在class文件中可用,但会被VM丢弃
* RetentionPolicy.RUNTIME VM将在运行期也保留注释,因此可以通过反射机制读取注解的信息。
*
* @Documented 将此注解包含在 javadoc 中
*
* @Inherited 允许子类继承父类中的注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
在Component中(@Component标注的类,包括@Service,@Repository, @Controller)使用@Bean注解和在@Configuration中使用是不同的。在@Component类中使用方法或字段时不会使用CGLIB增强(及不使用代理类:调用任何方法,使用任何变量,拿到的是原始对象)。而在@Configuration类中使用方法或字段时则使用CGLIB创造协作对象(及使用代理:拿到的是代理对象);当调用@Bean注解的方法时它不是普通的Java语义,而是从容器中拿到由Spring生命周期管理、被Spring代理甚至依赖于其他Bean的对象引用。在@Component中调用@Bean注解的方法和字段则是普通的Java语义,不经过CGLIB处理。
大意是说:在@Configurer中注解的@Bean会被代理为拥有Spring生命周期的Bean,而@Component中则不会,仍然是原生的Java语意。即原来是prototype,则仍然是prototype。该对象就是一个简单的java对象。