真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

SpringIOC和aop的原理及實(shí)例詳解

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

成都創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),資中企業(yè)網(wǎng)站建設(shè),資中品牌網(wǎng)站建設(shè),網(wǎng)站定制,資中網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,資中網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。

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

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

首先來(lái)一段ioc的實(shí)現(xiàn)原來(lái)代碼:

public class ClassPathXmlApplicationContext implements BeanFactory {
 
 private Map beans = new HashMap();
 
 //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)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文件

 
 
  
 
 

以上代碼實(shí)現(xiàn)了將UserDAOImpl注入到userService.

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

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

scope:singleton(單例,即每次調(diào)用的對(duì)象都為同一個(gè))。 prototype(原型,即以bean對(duì)象為原型,每次new一個(gè)新對(duì)象出來(lái))

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

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

AOP(切面編程)

首先還是先來(lái)一段代碼

定義一個(gè)InvocationHandler的實(shí)現(xiàn)類

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());
 }

調(diào)用測(cè)試類,service和DAO實(shí)現(xiàn)類沒(méi)有貼出來(lái),就是打印一句話出來(lái)表現(xiàn)方法執(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;
 }
}

以上代碼簡(jiǎn)單的實(shí)現(xiàn)了一個(gè)動(dòng)態(tài)代理,并執(zhí)行了自己的一段邏輯。

那么aop是如何實(shí)現(xiàn)切面編程的呢,就是通過(guò)動(dòng)態(tài)代理。當(dāng)然這也是spring來(lái)實(shí)現(xiàn)的,而我們需要做的就是知道如何編寫編織語(yǔ)法。

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

需要注意的是:被產(chǎn)生代理的對(duì)象需要現(xiàn)實(shí)接口spring才能產(chǎn)生代理對(duì)象,默認(rèn)使用java se 中的 InvocationHandler 和 proxy 兩個(gè)類產(chǎn)生代理對(duì)象,若沒(méi)有實(shí)現(xiàn)接口,則需要另外引入一個(gè)jar包(cglib-nodep-2.1_3.jar);他是通過(guò)二進(jìn)流的方式產(chǎn)生代理對(duì)象。

那么spring 幫我們做了什么?

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

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

所以這里可以總結(jié)一下,java se 的特點(diǎn)有反射,動(dòng)態(tài)代理,(這里面必然會(huì)用到多態(tài),動(dòng)態(tài)綁定)

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。


網(wǎng)頁(yè)標(biāo)題:SpringIOC和aop的原理及實(shí)例詳解
轉(zhuǎn)載源于:http://weahome.cn/article/jgjpeo.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部