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();
}
}
此时的运行结果为: