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