Spring浅探

  热度最大的框架,它也称为业务层框架。Spring这个框架的诞生,给程序员揭示了两个主要的思想:Ioc,Aop;

  最近的网页架构可以分为这样。

  

  传统结构中,每个层都得new出依赖层的类进行一些本层操作,而Spring的出现使得这些层与层的依赖关系变得不那么紧致。所有的需要新建的类都由Spring的bean工厂提供。控制权限被反转了,所以称为控制反转(Inversion of Control)。

  而在业务层有很多模块,为了使每个模块更专注于自己的工作,并且不用考虑模块间的耦合,Spring提出了Aop的思想。类与类间的关系除了继承多态,没有定义平行的关系,而Aop弥补了类间关系,使得切面实现业务又丰富又简单。

  Ioc范例

package IoC_AOP;

public interface Person {
    public void speak();
}
package IoC_AOP;

public class Chinese implements Person{
    private String name;
    private String age;
    public Chinese(){
        
    }
    public Chinese(String name, String age) {
        super();
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    @Override
    public void speak() {
        // TODO Auto-generated method stub
        System.out.println("I'm Chinese,my name is "+this.name+" ,my age is "+this.age);

    }

}
package IoC_AOP;

public class American implements Person{
    private String name;
    private String age;
    public American(){
        
    }
    public American(String name, String age) {
        super();
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAge() {
        return age;
    }
    public void setAge(String age) {
        this.age = age;
    }
    @Override
    public void speak() {
        // TODO Auto-generated method stub
        System.out.println("I'm American,my name is "+this.name+" ,my age is "+this.age);
    }
    
}
    public void IocTest(){
        Injection in = new Injection();
        Person p1 = in.proxy1("zhangsan", "18");
        Person p2 = in.proxy2("tom", "19");
        p1.speak();
        p2.speak();
    }

   Aop思想原理,通过使用动态代理来实现。

package IoC_AOP;

public interface interface1 {
    public void doSomething();
}
package IoC_AOP;


public class subject implements interface1{
    public void doSomething(){
        System.out.println("hello i'm doing my jobs");
    }
}
package IoC_AOP;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class proxySubject implements InvocationHandler{

    private Object proxied;
    public proxySubject(Object proxied){
        this.proxied = proxied;
    }
    public void setProxied(Object proxied) {
        this.proxied = proxied;
    }
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // TODO Auto-generated method stub
        //执行方法之前可以做一些操作
        
        //执行目标方法
        method.invoke(proxied, args);
        //之后可以执行一些操作
        return null;
    }
    
}
        subject real = new subject();   
        interface1 proxySubject = (interface1)Proxy.newProxyInstance(interface1.class.getClassLoader(), 
         new Class[]{interface1.class}, 
         new proxySubject(real));
        proxySubject.doSomething();
proxy:  指代我们所代理的那个真实对象
method:  指代的是我们所要调用真实对象的某个方法的Method对象
args:  指代的是调用真实对象某个方法时接受的参数

  Spring的配置

    下载spring-framework-3.2.0.RELEASE,在官网下载,然后再下载commons-logging-1.2。

    添加到buildpath。下载下来的包的lib下,同一个jar包有三份。

    

    只要导入jar就行。

    

    然后导入commons-loggin的jar包。

    src下新建applicationContext.xml配置文件。配置文件的bean代表加载一个类,通过Spring的工厂生产出来并注入到应用的类。    

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:context="http://www.springframework.org/schema/context"
 xmlns:tx="http://www.springframework.org/schema/tx"
 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"
 default-autowire="byName" default-lazy-init="true">
<bean id="chinese" class="Beans.Chinese">
    <property name="name">
        <value>sss</value>
    </property>
    <property name="age">
        <value>18</value>
    </property>
</bean>
<bean id="america" class="Beans.American">
    <property name="name">
        <value>xxx</value>
    </property>
    <property name="age">
        <value>19</value>
    </property>
</bean>

</beans>

  书写范例 

package Beans;

public interface Person {
    public void speak();
}
package Beans;

public class Chinese  implements Person{
    private String name;
    private int age;
    

    public String getName() {
        return name;
    }


    public void setName(String name) {
        this.name = name;
    }


    public int getAge() {
        return age;
    }


    public void setAge(int age) {
        this.age = age;
    }


    @Override
    public void speak() {
        // TODO Auto-generated method stub
        System.out.println("I'm Chinese,my name "+this.name+",my age "+this.age);
        
    }

}
package Beans;

public class American implements Person{
    private String name;
    private String age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getAge() {
        return age;
    }
    public void setAge(String age) {
        this.age = age;
    }
    @Override
    public void speak() {
        // TODO Auto-generated method stub
        System.out.println("I'm American,my name "+this.name+",my age "+this.age);
    }
    
}

  使用Junit包进行测试。  

package JunitTest;

import org.junit.Test;
import org.springframework.context.*;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import Beans.Person;

public class Test1 {
    @Test
    public void TestSpringMethod(){
        ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
        Person p1=(Person)context.getBean("chinese");
        p1.speak();
        p1=(Person)context.getBean("america");
        p1.speak();
        
    }
}

  时日尚浅,没有经验,日后加倍努力。

原文地址:https://www.cnblogs.com/chentingk/p/5837635.html