SSH三大框架常用註解
註解與XML配置的區別
註解:是一種分散式的元資料,與原始碼耦合。
xml :是一種集中式的元資料,與原始碼解耦。
因此註解和XML的選擇上可以從兩個角度來看:分散還是集中,原始碼耦合/解耦。
註釋配置相對於 XML 配置具有很多的優勢:
它可以充分利用 Java 的反射機制獲取類結構資訊,這些資訊可以有效減少配置的工作。如使用 JPA 註釋配置 ORM 對映時,我們就不需要指定 PO 的屬性名、型別等資訊,如果關係表字段和 PO 屬性名、型別都一致,您甚至無需編寫任務屬性對映資訊——因為這些資訊都可以通過 Java 反射機制獲取。
註釋和 Java 程式碼位於一個檔案中,而 XML 配置採用獨立的配置檔案,大多數配置資訊在程式開發完成後都不會調整,如果配置資訊和 Java 程式碼放在一起,有助於增強程式的內聚性。而採用獨立的 XML 配置檔案,程式設計師在編寫一個功能時,往往需要在程式檔案和配置檔案中不停切換,這種思維上的不連貫會降低開發效率。
常用註解總結
1、Hibernate框架的
Hibernate的註解主要用在持久化類那一塊:
@Entity
指定當前類是實體類。
@Entity
public class User() {
private Integer id;
private String name;
}
@Table
指定實體類和資料庫表之間的對應關係。
屬性:
name:指定資料庫表的名稱
@Entity
@Table(name="t_user")
public class User() {
private Integer id;
private String name;
}
@Id
指定當前欄位是主鍵。
@Entity
@Table(name="t_user")
public class User() {
@Id
private Integer id;
private String name;
}
@GeneratedValue
指定主鍵的生成方式。 屬性: strategy :指定主鍵生成策略。 JPA 提供的四種標準用法為 TABLE,SEQUENCE,IDENTITY,AUTO。
@Entity
@Table(name="t_user")
public class User() {
@Id
@GeneratedValue(strategy = IDENTITY)
private Integer id;
private String name;
}
@Column
指定實體類屬性和資料庫表字段之間的對應關係
屬性:
name:指定資料庫表的列名稱。
unique:是否唯一
nullable:是否可以為空
inserttable:是否可以插入
updateable:是否可以更新
@Entity
@Table(name="t_user")
public class User() {
@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "user_id")
private Integer id;
@Column(name = "user_name")
private String name;
}
@Temporal
設定日期時間
方式一:@Temporal(TemporalType.DATE)對映為日期 // birthday date (只有日期)
方式二:@Temporal(TemporalType.TIME)對映為日期 // birthday time (是有時間)
方式三:@Temporal(TemporalType.TIMESTAMP)對映為日期 //birthday datetime (日期+時間)
@Temporal(TemporalType.DATE)
private Date birthday;
@Lob
作用:設定大資料型別
方式一:
@Lob
private String text; //text longtext
方式二:
@Lob
private byte[] image; // image longblob
@Enumerated
作用:設定列舉型別
方式一:
/** 儲存字串到資料庫 */
@Enumerated(EnumType.STRING)
private Role role;
方式二:
/** 儲存整數到資料庫 */
@Enumerated(EnumType.ORDINAL)
private Role role;
上面定義的列舉:Role
/** 角色 */
public enum Role {
遊客, 會員, 管理員
}
使用:
User user = new User();
user.setRole(Role.管理員);
@Transient
作用:修飾的欄位不會被持久化
@Transient
private String temp;
這樣也可以:
private transient String temp;
一對多涉及的註解:
@OneToMany:
作用:建立一對多的關係對映
屬性:
targetEntityClass:指定多的多方的類的位元組碼
mappedBy:指定從表實體類中引用主表物件的名稱。
cascade:指定要使用的級聯操作
fetch:指定是否採用延遲載入
orphanRemoval:是否使用孤兒刪除
@ManyToOne
作用:建立多對一的關係
屬性:
targetEntityClass:指定一的一方實體類位元組碼
cascade:指定要使用的級聯操作
fetch:指定是否採用延遲載入
optional:關聯是否可選。如果設定為false,則必須始終存在非空關係。
@JoinColumn
作用:用於定義主鍵欄位和外來鍵欄位的對應關係。
屬性:
name:指定外來鍵欄位的名稱
referencedColumnName:指定引用主表的主鍵欄位名稱
unique:是否唯一。預設值不唯一
nullable:是否允許為空。預設值允許。
insertable:是否允許插入。預設值允許。
updatable:是否允許更新。預設值允許。
columnDefinition:列的定義資訊。
多對多涉及的註解:
@ManyToMany
作用:用於對映多對多關係
屬性:
cascade:配置級聯操作。
fetch:配置是否採用延遲載入。
targetEntity:配置目標的實體類。對映多對多的時候不用寫。
@JoinTable
作用:針對中間表的配置
屬性:
nam:配置中間表的名稱
joinColumns:中間表的外來鍵欄位關聯當前實體類所對應表的主鍵欄位 inverseJoinColumn:中間表的外來鍵欄位關聯對方表的主鍵欄位
@JoinColumn
作用:用於定義主鍵欄位和外來鍵欄位的對應關係。
屬性:
name:指定外來鍵欄位的名稱
referencedColumnName:指定引用主表的主鍵欄位名稱
unique:是否唯一。預設值不唯一
nullable:是否允許為空。預設值允許。
insertable:是否允許插入。預設值允許。
updatable:是否允許更新。預設值允許。
columnDefinition:列的定義資訊。
2、Struts2框架的
@NameSpace
出現的位置: 它只能出現在 package 上或者 Action 類上。 一般情況下都是寫在 Action 類上。
作用: 指定當前 Action 中所有動作方法的名稱空間。
屬性:
value: 指定名稱空間的名稱。寫法和 xml 配置時一致。 不指定的話,預設名稱空間是""。
@ParentPackage
出現的位置: 它只能出現在 package 上或者 Action 類上。 一般情況下都是寫在 Action 類上。
作用: 指定當前動作類所在包的父包。由於我們已經是在類中配置了,所以無需在指定包名了。
屬性:
value: 指定父包的名稱。
@Action
出現的位置: 它只能出現在 Action 類上或者動作方法上。 一般情況下都是寫在動作方法上。
作用: 指定當前動作方法的動作名稱。 也就是 xml 配置時 action 標籤的 name 屬性。
屬性:
value: 指定動作名稱。
results[]: 它是一個數組,資料型別是註解。用於指定結果檢視。此屬性可以沒有,當沒有該屬性時,表示不返回任何結果檢視。即使用 response 輸出響應正文。
interceptorRefs[]: 它是一個數組,資料型別是註解。用於指定引用的攔截器。
@Result
出現的位置: 它可以出現在動作類上,也可以出現在 Action 註解中。
作用: 出現在類上,表示當前動作類中的所有動作方法都可以用此檢視。出現在 Action 註解中,表示當前 Action 可用此檢視。
屬性:
name: 指定邏輯結果檢視名稱。
type: 指定前往檢視的方式。 例如:請求轉發,重定向,重定向到另外的動作。
location: 指定前往的地址。可以是一個頁面,也可以是一個動作。
@Results
出現的位置: 它可以出現在動作類上,也可以出現在 Action 註解中。
作用: 用於配置多個結果檢視。
屬性:
value: 它是一個數組,資料型別是 result 註解。
@InterceptorRef
出現的位置: 它可以出現在動作類上或者 Action 註解中。
作用: 用於配置要引用的攔截器或者攔截器棧
屬性:
value: 用於指定攔截器或者攔截器棧
3、Spring框架的
1、IOC的註解
@Component :建立物件
@Controller
把檢視層類交給Spring管理
@Controller
public class UserAction() {
}
@Service
把業務層類交給Spring管理
@Service
public class UserService() {
}
@Repository
把持久層類交給Spring管理
@Repository
public class UserDao() {
}
@Autowired
根據型別自動注入物件
@Autowired
private UserDao userDao;
@Qualifier
與上面的Autowired一起用,目的根據id獲取物件
//例:把持久化層交給Spring管理,並在業務層通過id注入持久化層物件
@Repository("userDao")
public class UserDao() {}
@Service
public class UserService() {
@Autowired
@Qualifier("userDao")
private UserDao userDao;
}
@Resource
可以根據型別注入,也可以根據id裝配,name屬性就是bean的id
@Resource(name="userDao")
private UserDao userDao;
@Value
注入基本型別和字串型別
@Scope
單例與多例的配置,預設是單例
singleton(單例);prototype(多例);request session
//例:Action是多例的,所以應配置對應的屬性,而dao層是單例的,不用配置
@Controller
@Scope(value="prototype")
public class UserAction() {
}
@Repository
public class UserDao() {
}
@Configuration :
定義配置類,用於替換spring中的xml檔案的
@Configuration
public class SpringConfiguration {
}
@ComponentScan:
開啟註解掃描
@Configuration
//@ComponentScan(basePackages={"cn"})
//@ComponentScan(value={"cn"})
@ComponentScan({"cn"})//value:指定掃描的包【推薦,因為可以不寫】
public class SpringConfiguration {
}
@PropertySource
指定的配置檔案
@Configuration
@PropertySource(value="classpath:/config/jdbc.properties")
public class SpringConfiguration {
/**
* 告訴spring框架開啟el表示式
* 在4.3版本以前都需要這個佔位符類
* 在4.3版本之後以下程式碼可以省略不寫
*/
@Bean
public PropertySourcesPlaceholderConfigurer createPSPC(){
return new PropertySourcesPlaceholderConfigurer();
}
}
@Bean
用在方法上面,建立物件的,根據方法的返回型別
@Component
public class JdbcConfig {
@Bean(name="dataSource")//相當於:<bean id="ds" class="com.mchange.v2.c3p0.ComboPooledDataSource" />
public DataSource createDataSource(){
ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
try {
comboPooledDataSource.setDriverClass("com.mysql.jdbc.Driver");
} catch (Exception e) {
e.printStackTrace();
}
comboPooledDataSource.setJdbcUrl("jdbc:mysql://localhost:3306/springIOC");
comboPooledDataSource.setUser("root");
comboPooledDataSource.setPassword("root");
return comboPooledDataSource;
}
@Bean(name="queryRunner")
public QueryRunner createQr(@Qualifier(value="dataSource") DataSource dataSource){
return new QueryRunner(dataSource);
}
}
@Import
匯入其他的配置類,交給Spring管理
@Configuration
@Import(value={JdbcConfig.class})
public class SpringConfiguration {
}
2、AOP的常用註解
AOP : 全稱是Aspect Oriented Programming 即: 面向切面程式設計
需要在Spring的主配置檔案中新增以下標籤。開啟aop註解的支援
<aop:aspectj-autoproxy/>
@Aspect
作用:把當前類宣告為切面類。
@Aspect //宣告為切面類
public class MyLogger {
}
@Before
作用:把當前方法看成是前置通知。
屬性:
value:用於指定切入點表示式,還可以指定切入點表示式的引用。
@Aspect //宣告為切面類
public class MyLogger {
//前置通知
@Before("pt1()")
public void beforePrintLog(){
System.out.println("前置通知:列印日誌了......");
}
}
@AfterReturning
作用:把當前方法看成是後置通知。
屬性:
value:用於指定切入點表示式,還可以指定切入點表示式的引用。
@Aspect //宣告為切面類
public class MyLogger {
//後置通知
@AfterReturning("pt1()")
public void afterRetunningPrintLog(){
System.out.println("後置通知:列印日誌了......");
}
}
@AfterThrowing
作用:把當前方法看成是異常通知。
屬性:
value:用於指定切入點表示式,還可以指定切入點表示式的引用。
@Aspect //宣告為切面類
public class MyLogger {
//異常通知
@AfterThrowing("pt1()")
public void afterThrowingPrintLog(){
System.out.println("異常通知:列印日誌了......");
}
}
@After
作用:把當前方法看成是最終通知。
屬性:
value:用於指定切入點表示式,還可以指定切入點表示式的引用。
@Aspect //宣告為切面類
public class MyLogger {
//最終通知
@After("pt1()")
public void afterPrintLog(){
System.out.println("最終通知:列印日誌了......");
}
}
@Around
作用:把當前方法看成是環繞通知。
屬性:
value:用於指定切入點表示式,還可以指定切入點表示式的引用。
@Pointcut
作用:指定切入點表示式
屬性:
value:指定表示式的內容
/**
* 切入點
*/
@Pointcut("execution(public void cn.service.impl.CustomerServiceImpl.saveCustomer())")
public void pt1(){}
/**
* 環繞通知:
* 是spring提供給我們的手動控制程式碼執行的通知,
* 方法中需要手動控制方法執行
*
* 引數中需要一個介面:Spring注入的,瞭解
* ProcedingJoinPoint
*/
@Around("pt1()")
public Object around(ProceedingJoinPoint pjp){
//System.out.println("最終通知:列印日誌......");
Object[] obj = pjp.getArgs();//引數
//返回值
Object rtValue = null;
//手動呼叫方法
try {
//前置通知
System.out.println("前:列印日誌");
pjp.proceed(obj);
//後置通知
System.out.println("後:列印日誌");
} catch (Throwable e) {
//異常通知
System.out.println("異:列印日誌");
e.printStackTrace();
}finally{
//最終通知
System.out.println("終:列印日誌");
}
return rtValue;
}
3、事務的註解
@Transactiona
宣告在類上是表示全域性事務,宣告在方法上表示區域性事務,區域性事務會覆蓋全域性事務,預設屬性是傳播事務,非只讀
@Transactional(readOnly=true)
public class AccountServiceImpl implements IAccountService {
public Account findAccountById(Integer id) {
return ad.findAccountById(id);
}
}
@EnableTransactionManagement
開啟事務管理器
@Configuration
@EnableTransactionManagement
public class SpringConfiguration {
}