參見: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 <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 }