最近学习springboot时,发现注解的使用还是很重要的,于是在这回顾一下
关于容器
@Component
:把资源让 spring 来管理。相当于在 xml 中配置一个 bean。
value:指定 bean 的 id。如果不指定 value 属性,默认 bean 的 id 是当前类的类名。首字母小写。@Controller
:一般用于表现层的注解。
@Service
:一般用于业务层的注解。
@Repository
:一般用于持久层的注解。
这三个注解都是针对一个的衍生注解,他们的作用及属性都是一模一样的。他们只不过是提供了更加明确的语义化。细节:如果注解中有且只有一个属性要赋值时,且名称是 value,value 在赋值是可以不写。
关于注入
-
@Autowrited
注解:自动按类型注入
如果有唯一一个类型与之匹配,那么就自动注入。如果有多个类型符合要注入的类型时,会根据这个变量名找对应的@Component中(一般为@Repository(id=’’))中的id,若相同就注入。这就要我们根据想具体注入那个(接口)类型去改变量名和类上的Repository的那个id相同 -
@Qualifie
注解
作用在成员变量上:自动按类型注入的基础之上,可以指定id注入,当在给类成员注入时不能单独使用,要和AutoWrited配合使用。
注意:如果这个注解作用在方法参数上:那么会去IOC容器中找bean对象,找的方式和Autowrited注解一样(先按类型再按id,只不过Autowrite的id就是变量名,Qualified的id是注解的属性),当出现和autowrited注解的同样问题时,直接使用Qualifier注解在参数上就好了这里的Qualfier是不需要和autowrited配合使用的。 -
@Resource
注解:可以直接指定id进行注入,可以单独使用。(Autowrited和Qualifie和Resource只能注入其他bean类型,不能注入基本类型和String类型)。 -
@Value
注解:用于注入基本类型和String类型,value属性就是基本类型的值集合注入只能通过xml配置 -
@PostConstruct
用于指定初始化方法。 -
@PreDestroy
用于指定销毁方法。
spring的新注解
(一般用于可以替换applicationContext.xml的配置类)
-
@Configuration
:写在类上表示这是一个配置类,可以代替applicationContext.xml
注意:当这个配置类作为AnnotationConfigApplicationContext的参数时,这个注解可以不写。 -
@Import
:用于导入其他配置类,在引入其他配置类时,可以不用再写@Configuration 注解。当然,写上也没问题。 -
@ComponentScan
:属性是basePackage|value,指定要扫描的包,作用和在 spring 的 xml 配置文件中的:< context:component-scan base-package=“com.baidu”/ >是一样的。 -
@Bean
:把当前方法返回值作为bean对象存入springIOC容器中,name属性指定id,id默认值是当前方法名称
注意:如果这个方法有参数,那么回去IOC容器中找bean对象,找的方式和Autowrited注解一样(先按类型再按id),当出现和autowrited注解的同样问题时,直接使用Qualifier注解在参数上就好了这里的Qualfier是不需要和autowrited配合使用的。 -
@Scope
:和Bean注解配合使用,可以定义该返回值对象是多例还是单例的 -
@PropertySource:
引入外部properties配置文件,和Value注解配合使用可以引入基本和String类型数据,classpath:关键字可以知道在类路径下 -
@RunWith
:指定测试时以哪个类的启动器 -
@ContextConfiguration
注解:
locations 属性:用于指定配置文件的位置。如果是类路径下,需要用 classpath:表明
classes 属性:用于指定注解的类。当不使用 xml 配置时,需要用此属性指定注解类的位置。
例如:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations= {"classpath:bean.xml"})
public class AccountServiceTest {
}
关于配置类:
(配置类之间是父子关系,推荐):AnnotationConfigApplicationContext ac=new AnnotationConfigApplicationContext(主配置类.class);
其他配置类的引入可以在主配置类中使用import注解引入,(但是这种各个配置类之间为兄弟关系,不是推荐:AnnotationConfigApplicationContext ac=new AnnotationConfigApplicationContext(主配置类.class,...其他配置类.class);
例如:
主配置类:
//@Configuration
@ComponentScan("com.baidu")
@Import(JdbcConfig.class)
@PropertySource("classpath:jdbcConfig.properties")
public class SpringConfiguration {
}
@Configuration
@ComponentScan("com.baidu")
@Import({JdbcConfig.class,TransactionConfig.class})
@PropertySource("jdbcConfig.properties")
@EnableTransactionManagement
public class SpringConfiguration {
}
其他配置类:
public class JdbcConfig {
@Value("${jdbc.driver}")
private String driver;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
/**
* 用于创建一个QueryRunner对象
* @param dataSource
* @return
*/
@Bean(name="runner")
@Scope("prototype")
public QueryRunner createQueryRunner(@Qualifier("ds2") DataSource dataSource){
return new QueryRunner(dataSource);
}
/**
* 创建数据源对象
* @return
*/
@Bean(name="ds2")
public DataSource createDataSource(){
try {
ComboPooledDataSource ds = new ComboPooledDataSource();
ds.setDriverClass(driver);
ds.setJdbcUrl(url);
ds.setUser(username);
ds.setPassword(password);
return ds;
}catch (Exception e){
throw new RuntimeException(e);
}
}
@Bean(name="ds1")
public DataSource createDataSource1(){
try {
ComboPooledDataSource ds = new ComboPooledDataSource();
ds.setDriverClass(driver);
ds.setJdbcUrl("jdbc:mysql://localhost:3306/eesy02");
ds.setUser(username);
ds.setPassword(password);
return ds;
}catch (Exception e){
throw new RuntimeException(e);
}
}
}
关于AOP
@Aspect
在通知类上使用@Aspect 注解声明为切面,把当前类声明为切面类。
@Before
把当前方法看成是前置通知。属性:value:用于指定切入点表达式,还可以指定切入点表达式的引用。
@AfterReturning
把当前方法看成是后置通知。属性:value:用于指定切入点表达式,还可以指定切入点表达式的引用
@AfterThrowing
把当前方法看成是异常通知。属性:value:用于指定切入点表达式,还可以指定切入点表达式的引用
@After
把当前方法看成是最终通知。属性:value:用于指定切入点表达式,还可以指定切入点表达式的引用
@Around
把当前方法看成是环绕通知。属性:value:用于指定切入点表达式,还可以指定切入点表达式的引用。
例如:(回顾环绕通知的写法)
@Around("execution(* com.baidu.service.impl.*.*(..))")
public Object transactionAround(ProceedingJoinPoint pjp) {
//定义返回值
Object rtValue = null;
try {
//获取方法执行所需的参数
Object[] args = pjp.getArgs();
//前置通知:开启事务
beginTransaction();
//执行方法
rtValue = pjp.proceed(args);
//后置通知:提交事务
commit();
}catch(Throwable e) {
//异常通知:回滚事务
rollback();
e.printStackTrace();
}finally {
//最终通知:释放资源
release();
}
return rtValue;
}
@Pointcut
指定切入点表达式属性:value:指定表达式的内容
@Pointcut("execution(* com.baidu.service.impl.*.*(..))")
private void pt1() {}
@Configuration
@ComponentScan(basePackages="com.baidu")
@EnableAspectJAutoProxy
public class SpringConfiguration {
}
关于事务
@Transactional(readOnly=true,propagation=Propagation.SUPPORTS)
:是声明式事务管理 ,该注解的属性和 xml 中的属性含义一致。该注解可以出现在接口上,类上和方法上。出现接口上,表示该接口的所有实现类都有事务支持。出现在类上,表示类中所有方法有事务支持,出现在方法上,表示方法有事务支持。以上三个位置的优先级:方法>类>接口,可以参考
其属性如图所示: