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 中的屬性含義一致。該註解可以出現在接口上,類上和方法上。出現接口上,表示該接口的所有實現類都有事務支持。出現在類上,表示類中所有方法有事務支持,出現在方法上,表示方法有事務支持。以上三個位置的優先級:方法>類>接口,可以參考
其屬性如圖所示:
在這裏插入圖片描述

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