Spring框架使用(控制反轉,依賴注入,面向切面AOP)


參見:http://blog.csdn.net/fei641327936/article/details/52015121

Mybatis:

實現IOC的輕量級的一個Bean的容器

Inversion of control 控制反轉:由容器控制程序之間的關系,不是程序代碼操作

Depend Inject 依賴注入

Aspect oriented programming 面向切面編程

Spring能幫助我們根據配置文件創建及組裝對象之間的依賴關系;

Spring面向切面編程能幫助我們無耦合的實現日志記錄,性能統計,安全控制

Spring能非常簡單的幫我們管理數據庫事務

誰依賴誰:應用程序依賴於IOC容器

為什么需要依賴:應用程序需要IOC容器來提供對象需要的外部資源

誰注入誰:IOC容器注入應用程序某個對象,應用程序依賴的對象

注入了什么:注入某個對象所需要的外部資源(包括對象,資源,常量數據)

Bean:由IOC容器管理的那些組成你應用程序的對象我們叫Bean

控制反轉:就是說創建對象的控制權進行轉移,以前創建對象的主動權和創建時機是由自己把控的,而現在這種權利轉移到第三方。

控制的什么被反轉了:獲得依賴對象的方式反轉了

缺點:

1>.IOC容器生成對象是通過反射方式,在運行效率上有一定的損耗。如果追求運行效率的話,就必須對此進行權衡。

2>.需要進行大量的配置工作,比較繁瑣,對小項目而言,加大一些工作成本。

1.依賴注入的方式:

第一種方法:依賴get() set()方法實例化Bean

1>.如果默認注冊為default-autowire="byname",則bean里面的參數就不用寫了

2>.如果不寫默認注冊為名稱,則bean里面需要property(name和ref)

第二種方式:依賴構造方法實例化Bean

1>.如果默認注冊為default-autowire="constructor"則bean里面的constructor-arg就不用寫了。

2>.如果不寫默認注冊為構造,則bean里面需要寫constructory-arg ref

第三種方式:注解

只寫屬性,屬性上面@Resource(type=類.class)

配置文件需要配置自動掃描

<context:component-scan base-package="包名前面"></...>

  1.  1 <context:annotation-config/>  
     2    <!-- (當前實例在spring容器中的標識 class 當前類的包名和類名) -->  
     3    <bean id="bookDao" class="com.hellojava.dao.BookDao"></bean>  
     4 <bean id="oracleBookDao" class="com.hellojava.dao.OracleBookDao"></bean>  
     5   
     6   
     7 <bean id="bookService" class="com.hellojava.business.BookService"></bean>  
     8     <!-- 使用get() set()方法   實例化bean(默認注冊為 default-autowire="byName"這里就可以不用寫)  
     9     <property name="bookDao" ref="bookDao"></property>  
    10       
    11     使用構造器方法    實例化bean(默認注冊為 default-autowire="constructor"這里就可以不用寫)  
    12     <constructor-arg  ref="bookDao"></constructor-arg>  
    13 </bean> -->  
    14 <context:component-scan base-package="com.hellojava"></context:component-scan>  

 

1>.通過注解注入Bean

@Autowired:自動裝配

根據類型注入,用於構造器,字段,方法注入

*寫在哪個上面,相當去在xml文件中寫的default-autowire

2>.通過JSR-250注解

@Resource:自動裝配

只用於setter(方法注入)  配置@Resource(type=類名)或者(name=屬性)

3>.@Service注解一個業務類

@Resource:自動裝配

@Repository:持久層的注解

2.Spring AOP 面向切面編程

通知Advice:定義了切面是什么以及何時使用。描述了切面要完成的工作和何時需要執行這個工作。

連接點Joinpoint:程序能夠應用通知的一個"時機",這些"時機"就是連接點,類如方法被調用時,異常被拋出時等。

切入點Pointcut:通知定義了切面要發生的"故事"和時間,那么切入點就是定義了"故事"發生的地點,類如某個類或者方法的名稱。

切面Aspect:通知和切入點共同組成了切面(時間,地點和要發生的"故事")

引入Introduction:引入我們向現有的類添加新的方法和屬性(spring提供了一個方法注入的功能)

目標Target:即被通知的對象

代理Proxy:應用通知的對象,原生對象(基礎)+切面(JDK動態代理或者CGLIB代理(hibernate))

織入Weaving:把切面應用到目標對象來創建新的代理對象的過程,織入一般發生在如下幾個時機

1>.編譯時:當一個類文件被編譯時進行織入

2>.類加載時:使用特殊的ClassLoader在目標類被加載到程序之前增強類的字節代碼

3>.運行時:切面在運行的某個時刻被織入,springAOP就是以這種方式織入切面的,原理使用了JDK的動態代理技術。

Spring提供了4種實現AOP的方式:

1>.經典的基於代理的AOP

2>.@AspectJ注解驅動的切面

3>.純POJO切面

4>.注入式AspectJ切面

基於代理的AOP:

1>.創建通知:實現這幾個接口,把其中的方法實現了

Before 前  After-returning 返回后  After-throwing 拋出后  Arround 周圍/環繞  Introduction 引入

2>.定義切點和通知者:在Spring 配置文件中配置這些信息

3>.使用proxyFactoryBean來生成代理

在配置文件里面:

1>.寫被代理對象的Bean

2>.定義切面和通知(Before After-returning After-throwing Interceptor)

3>.使用proxyBean 把通知代理到原生對象上 

@AspectJ注解驅動的切面

1>.配置文件自動掃描 comntext:component-scan

2>.配置文件aop:aspectj-autoproxy

3>.持久層@component("")

4>.切面 @Aspect @Component @通知(Before... ...)

AOP標簽配置+注解

1>.持久層@Component("")

2>.切面@Component("")

3>.配置文件:

定義:切入點pointcut

切面:Aspect

通知:Advice 方法為方法名  ref為切入點

 1 //@Service("bookService")  
 2 public class BookService {  
 3 //第三種方法:@Resource(type=IBaseDao.class)寫在屬性上面  ,配置文件需要配置自動掃描   
 4     //@Resource(type=IBaseDao.class)  
 5     @Resource(name="bookDao")  
 6     private IBaseDao bookDao;  
 7 //  第一種方法:依賴get() set()方法  實例化bean  
 8     public IBaseDao getBookDao() {  
 9         return bookDao;  
10     }  
11     public void setBookDao(IBaseDao bookDao) {  
12         this.bookDao = bookDao;  
13     }  
14 //  第二種方法:依賴構造方法 實例化bean  
15     /*public BookService(){} 
16     public BookService(IBaseDao bookDao){ 
17         this.bookDao=bookDao; 
18     }*/  
19       
20     public void hello(){  
21         String h=bookDao.hello();  
22         System.out.println(h);  
23     }  
24 }  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM