1. 程式人生 > >SSH三大框架常用註解

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 {

}