亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Spring IOC和aop的原理及實例詳解

 更新時間:2019年11月16日 10:19:13   作者:我看見的世界  
這篇文章主要介紹了Spring IOC和aop的原理及實例詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

這篇文章主要介紹了Spring IOC和aop的原理及實例詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

Spring是一個輕量級的控制反轉(IoC)和面向切面(AOP)的容器框架。特點是面向接口編程,松耦合。

1:IOC(控制反轉) 別名(DI:依賴注入)

首先來一段ioc的實現原來代碼:

public class ClassPathXmlApplicationContext implements BeanFactory {
 
 private Map<String , Object> beans = new HashMap<String, Object>();
 
 //IOC Inverse of Control DI Dependency Injection
 public ClassPathXmlApplicationContext() throws Exception {
  SAXBuilder sb=new SAXBuilder();
  //解析xml配置文件
  Document doc=sb.build(this.getClass().getClassLoader().getResourceAsStream("beans.xml"));
  Element root=doc.getRootElement(); //獲取根元素
  List list=root.getChildren("bean");//根元素下的子元素
  for(int i=0;i<list.size();i++) {
   Element element=(Element)list.get(i);
   String id=element.getAttributeValue("id");
   String clazz=element.getAttributeValue("class");
   Object o = Class.forName(clazz).newInstance(); //反射獲得實例
   System.out.println(id);
   System.out.println(clazz);
   beans.put(id, o);
   //注入bean屬性
   for(Element propertyElement : (List<Element>)element.getChildren("property")) {
    String name = propertyElement.getAttributeValue("name"); //userDAO
    String bean = propertyElement.getAttributeValue("bean"); //u
    Object beanObject = beans.get(bean);//UserDAOImpl instance
    
    String methodName = "set" + name.substring(0, 1).toUpperCase() + name.substring(1);
    System.out.println("method name = " + methodName);
    
    Method m = o.getClass().getMethod(methodName, beanObject.getClass().getInterfaces()[0]);
    m.invoke(o, beanObject); 
   }
  } 
 }

 public Object getBean(String id) {
  return beans.get(id);
 }
}
//xml文件
<beans>
 <bean id="u" class="com.bjsxt.dao.impl.UserDAOImpl" />
 <bean id="userService" class="com.bjsxt.service.UserService" >
  <property name="userDAO" bean="u"/>
 </bean>
 
</beans>

以上代碼實現了將UserDAOImpl注入到userService.

值得注意的是:以上操作都是spring幫我們實現的,我們只需要理解如何配置即可。

spring還提供了bean的生存周期和范圍屬性:

scope:singleton(單例,即每次調用的對象都為同一個)。 prototype(原型,即以bean對象為原型,每次new一個新對象出來)

init-method="init" destroy-method="destroy" lazy-init="true"(延遲初始化bean,即spring啟動時,不初始化bean,當需要使用時才實例化,作用:但spring啟動緩慢時可使用)

現在基本都是用注解實現,但只要能明白spring是如何實現bean的注入,基本原理都是一樣的。spring在中間的作用就是幫我們實現元素之前的注入,誰注入到誰就需要用到不同的注解了。

AOP(切面編程)

首先還是先來一段代碼

定義一個InvocationHandler的實現類

public class UserServiceTest {

 @Test
 public void testAdd() throws Exception {
  BeanFactory applicationContext = new ClassPathXmlApplicationContext();

  UserService service = (UserService)applicationContext.getBean("userService");
   
  User u = new User();
  u.setUsername("zhangsan");
  u.setPassword("zhangsan");
  service.add(u);
 }
 
 @Test
 public void testProxy() {
  UserDAO userDAO = new UserDAOImpl();
  LogInterceptor li = new LogInterceptor();
  li.setTarget(userDAO);
  UserDAO userDAOProxy = (UserDAO)Proxy.newProxyInstance(userDAO.getClass().getClassLoader(), userDAO.getClass().getInterfaces(), li);
  
  userDAOProxy.delete();
  userDAOProxy.save(new User());
 }

調用測試類,service和DAO實現類沒有貼出來,就是打印一句話出來表現方法執(zhí)行了。

public class LogInterceptor implements InvocationHandler {
 private Object target;
 public Object getTarget() {
  return target;
 }
 public void setTarget(Object target) {
  this.target = target;
 }

 public void beforeMethod(Method m) {
  System.out.println(m.getName() + " start");
 }

 @Override
 public Object invoke(Object proxy, Method m, Object[] args)
   throws Throwable {
  beforeMethod(m);
  m.invoke(target, args);
  return null;
 }
}

以上代碼簡單的實現了一個動態(tài)代理,并執(zhí)行了自己的一段邏輯。

那么aop是如何實現切面編程的呢,就是通過動態(tài)代理。當然這也是spring來實現的,而我們需要做的就是知道如何編寫編織語法。

  • JoinPoint:切入點
  • PointCut: 切入點的集合
  • Aspect:切面
  • Advice: 相當于Aspect的before
  • Around:周圍,環(huán)繞(需要帶參數ProceedingJoinPoint jp)

需要注意的是:被產生代理的對象需要現實接口spring才能產生代理對象,默認使用java se 中的 InvocationHandler 和 proxy 兩個類產生代理對象,若沒有實現接口,則需要另外引入一個jar包(cglib-nodep-2.1_3.jar);他是通過二進流的方式產生代理對象。

那么spring 幫我們做了什么?

1:充分利用java se 中的反射機制幫助我們對對象的注入,即 IOC,

2: 也是java se 中的動態(tài)代理幫助我們實現 切面編程,當然我們也需要熟悉一下asceptj 的切入語法。這就是aop。

所以這里可以總結一下,java se 的特點有反射,動態(tài)代理,(這里面必然會用到多態(tài),動態(tài)綁定)

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • java 類加載與自定義類加載器詳解

    java 類加載與自定義類加載器詳解

    本文主要介紹了java 類加載與自定義類加載器。具有一定的參考價值,下面跟著小編一起來看下吧
    2017-01-01
  • Java實現簡易提款機

    Java實現簡易提款機

    這篇文章主要為大家詳細介紹了Java實現簡易提款機,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Java實現提取不重復的整數實例

    Java實現提取不重復的整數實例

    這篇文章主要介紹了Java實現提取不重復的整數實例,具有一定借鑒價值,需要的朋友可以參考下
    2017-12-12
  • 關于單例模式懶漢式和餓漢式的區(qū)別及說明

    關于單例模式懶漢式和餓漢式的區(qū)別及說明

    這篇文章主要介紹了關于單例模式懶漢式和餓漢式的區(qū)別及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Java創(chuàng)建線程的兩種方式

    Java創(chuàng)建線程的兩種方式

    這篇文章主要介紹了Java創(chuàng)建線程的兩種方式,針對Java創(chuàng)建線程的兩種方式進行比較,感興趣的小伙伴們可以參考一下
    2016-10-10
  • idea工具欄如何添加快捷圖標的操作

    idea工具欄如何添加快捷圖標的操作

    這篇文章主要介紹了idea工具欄如何添加快捷圖標的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • Java中對list map根據map某個key值進行排序的方法

    Java中對list map根據map某個key值進行排序的方法

    今天小編就為大家分享一篇Java中對list map根據map某個key值進行排序的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • spring事務異?;貪L實例解析

    spring事務異常回滾實例解析

    這篇文章主要介紹了spring事務異?;貪L實例解析,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • 為SpringBoot服務添加HTTPS證書的方法

    為SpringBoot服務添加HTTPS證書的方法

    這篇文章主要介紹了為SpringBoot服務添加HTTPS證書的方法,幫助大家更好的理解和使用springBoot框架,感興趣的朋友可以了解下
    2020-10-10
  • Spring Boot Redis 集成配置詳解

    Spring Boot Redis 集成配置詳解

    本篇文章主要介紹了Spring Boot Redis 集成配置詳解,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05

最新評論