Spring 框架入门helloworld实例-------深入理解IOC、AOP

来源:互联网 发布:js使用base64显示图片 编辑:程序博客网 时间:2024/05/18 00:44

1.什么是J2EE规范
J2EE是Java2平台企业版(Java 2 Platform,Enterprise Edition),它的核心是一组技术规范与指南,提供基于组件的方式来设计、开发、组装和部署企业应用。
这里写图片描述
J2EE规范是基于JAVA的一系列标准:

1.客户端应用程序和applet是运行在客户端的组件

(applet是java编写的小应用程序,包含applet的网页将被下载,由支持java的浏览器在本地执行) 

2.Java Servlet 和 Java Server Page(JSP)是运行在服务器端的组件
3.Enterprise Java Bean(EJB)是运行在服务器端的业务组件

java bean:     简单来说java bean包含以下几个性质:     1.public 类,且包含无参构造函数     2.包含私有的属性和公有的get、set方法     3.支持各种事件,如mouseListener     4.支持反射机制     5.支持序列化和反序列化(需要用到读写硬盘或需要网络传输时,需序列化该javabean,实现serializable接口)     如此,但是java bean的具体概念我还是很模糊

2.什么是IOC
IOC(Inverse of Control 控制反转)是spring框架的核心,使得spring负责控制对象的生命周期和对象间的关系。一般情况下,我们需要一个对象时,常规方法是new一个对象,而IOC则省略了这一步骤,对象直接通过spring的bean工厂产生。

举个简单的例子,我们是如何找女朋友的?常见的情况是,我们到处去看哪里有长得漂亮身材又好的mm,然后打听她们的兴趣爱好、qq号、电话号、ip号、iq号………,想办法认识她们,投其所好送其所要,然后嘿嘿……这个过程是复杂深奥的,我们必须自己设计和面对每个环节。

传统的程序开发也是如此,在一个对象中,如果要使用另外的对象,就必须得到它(自己new一个,或者从JNDI中查询一个),使用完之后还要将对象销毁(比如Connection等),对象始终会和其他的接口或类藕合起来。  
 
那么IoC是如何做的呢?有点像通过婚介找女朋友,在我和女朋友之间引入了一个第三者:婚姻介绍所。婚介管理了很多男男女女的资料,我可以向婚介提出一个列表,告诉它我想找个什么样的女朋友,比如长得像李嘉欣,身材像林熙雷,唱歌像周杰伦,速度像卡洛斯,技术像齐达内之类的,然后婚介就会按照我们的要求,提供一个mm,我们只需要去和她谈恋爱、结婚就行了。简单明了,如果婚介给我们的人选不符合要求,我们就会抛出异常。整个过程不再由我自己控制,而是有婚介这样一个类似容器的机构来控制。

Spring所倡导的开发方式就是如此,所有的类都会在spring容器中登记,告诉spring你是个什么东西,你需要什么东西,然后spring会在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由 spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被spring控制,所以这叫控制反转。

控制:传统的通过new创建对象---> 程序主动创建     IOC容器创建对象,并控制对象(包括文件在内的外部资源获取)反转:     由容器帮助查找及注入依赖对象(DI),对象只是被动的接受依赖对象。

3.什么是AOP
AOP(Aspect Oriented Programming 面向切面编程)
OOP面向对象编程大家都很熟悉,那么面向切面编程是什么意思呢?我们举例子来便于理解两者的不同。

“雇员事件”   首先,OOP建立一个“Emplyee”类,对其属性和方法进行封装,当雇员时要用到其中的add()方法时,必须实例化一个对象,在此基础上进行操作。   但是,我们知道只有管理人员有权处理是否雇用某一个人,所以在此基础上要先进行“权限检查”,不仅这一个类,其他皆是如此,在面向对象的基础上我们就要在所有这些类中增加“权限检查”的方法,但是,在AOP的基础上,我们只需写这样一个方法,就可以对所有的包括“Emplyee”在内的类进行操作。

4.什么是spring框架
spring框架是J2EE应用程序框架,是轻量级的IOC和AOP的容器框架,主要是针对javaBean的生命周期进行管理的轻量级容器,可以单独使用,也可以和Struts框架,ibatis框架等组合使用。

BeanFactory是IOC容器的核心接口,负责实际化定位,配置应用程序中的对象及建立这些对象间的依赖。

xmlBeanFactory 实现BeanFactory接口,通过获取xml配置文件数据,组成应用对象及对象间的依赖关系。

5.helloWorld实例
理论知识模模糊糊好像弄清楚了,但是还是不太明白,于是自己动手建立了一个简单的项目,便于自己的理解。

1.建立spring项目,建立xml配置文件,如图。
这里写图片描述
打开如图:
这里写图片描述
2.建立helloworld类,设置属性和set方法

public class HelloWorld {    private String name;    private String id;    public HelloWorld(){        System.out.println("hello hello hello");    }    public void setName(String name){        System.out.println("name name name");        this.name = name;    }    public String getName(){        System.out.println("back name name");        return name;    }    public  void setId(String id){        System.out.println("id id id ");        this.id = id;    }    public void printHello(){        System.out.println("Hello"+name);    }    public void printId(){        System.out.println("Hello"+id);    }}

3.在xml文件中进行配置

<?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:util="http://www.springframework.org/schema/util"       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">    <bean id="myDemo" class="HelloWorld">            <property name="name" value="spring"></property>            <property name="id" value="12345"></property>    </bean></beans>

bean中的id相当于实例化的对象名,class为类名;
property的name的值为类中的属性,value即为属性的值。

4.main方法
第一步是创建在这里我们使用框架API ClassPathXmlApplicationContext() 应用程序上下文。这个API加载 beans 的配置文件,并最终基于所提供的API,它需要创建并初始化所有的对象在配置文件中提到的beans 类。
第二个步骤是用来使用创建的上下文的 getBean() 方法获得所需的bean。此方法使用 bean 的 id 返回,最终可以创建实际对象的通用对象。一旦有了对象,就可以使用这个对象调用任何类方法。

import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Main {    public static void main(String[] args){        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");        HelloWorld helloWorld = (HelloWorld)context.getBean("myDemo");        helloWorld.printHello();        helloWorld.printId();    }}

5.运行结果
这里写图片描述

我们在getbean方法那一行设置断点并debug,运行结果如下:
这里写图片描述
这里我们也看到在执行到第一步创建IOC容器对象的时候就调用了HelloWorld类的构造方法和setter方法。

6.为了更加深理解bean工厂,我又新建了一个类

public class HelloAgain {    private HelloWorld helloWorld;    public void setHelloWorld(HelloWorld helloWorld){        this.helloWorld = helloWorld;        System.out.println("again again again");    }      public void printWorld(){        System.out.println("final final "+helloWorld.getName());    }}

修改配置文件如下:

<?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:util="http://www.springframework.org/schema/util"       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">    <bean id="myDemo" class="HelloWorld">            <property name="name" value="spring"></property>            <property name="id" value="12345"></property>    </bean>    <bean id="helloagain" class="HelloAgain">        <property name="helloWorld" ref="myDemo"></property>    </bean></beans>

对于新加的bean,由于需要一个HelloWorld对象,因此需要把前方的HelloWorld对象mydemo传入,后方的ref中的参数即为要传入HelloAgain内部属性helloWorld的参数值。

main函数修改如下:

import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Main {    public static void main(String[] args){//        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");//        HelloWorld helloWorld = (HelloWorld)context.getBean("myDemo");//        helloWorld.printHello();//        helloWorld.printId();        ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");        HelloAgain helloAgain = (HelloAgain) context.getBean("helloagain");        helloAgain.printWorld();    }}

此时的运行结果为:
这里写图片描述

原创粉丝点击