Spring-注解回顾


最近学习springboot时,发现注解的使用还是很重要的,于是在这回顾一下

关于容器

  • @Component:把资源让 spring 来管理。相当于在 xml 中配置一个 bean。
    value:指定 bean 的 id。如果不指定 value 属性,默认 bean 的 id 是当前类的类名。首字母小写。
  • @Controller:一般用于表现层的注解。
    @Service:一般用于业务层的注解。
    @Repository:一般用于持久层的注解。
    这三个注解都是针对一个的衍生注解,他们的作用及属性都是一模一样的。他们只不过是提供了更加明确的语义化。细节:如果注解中有且只有一个属性要赋值时,且名称是 value,value 在赋值是可以不写。

关于注入

  • @Autowrited注解:自动按类型注入
    如果有多个类型符合要注入的类型时,会根据这个变量名找@repository(id=’’)中的id,若相同就注入。这就要我们根据想具体注入那个(接口)类型去改变量名和类上的Repository的那个id相同

  • @Qualifie注解
    作用在成员变量上:自动按类型注入,可以指定id当在给类成员注入时不能单独使用,要和AutoWrited配合使用。
    注意:如果这个注解作用在方法参数上:那么会去IOC容器中找bean对象,找的方式和Autowrited注解一样(先按类型再按id),当出现和autowrited注解的同样问题时,直接使用Qualifier注解在参数上就好了这里的Qualfier是不需要和autowrited配合使用的。

  • @Resource注解:可以直接指定id进行注入。也只能注入其他bean类型。

  • @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 中的属性含义一致。该注解可以出现在接口上,类上和方法上。出现接口上,表示该接口的所有实现类都有事务支持。出现在类上,表示类中所有方法有事务支持,出现在方法上,表示方法有事务支持。以上三个位置的优先级:方法>类>接口,可以参考
其属性如图所示:
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章