【Spring学习】MyEclipse10.7搭建Spring框架以及入门Demo演示

一. Spring介绍... 2

二. MyEclipse 10.7下搭建Spring框架... 3

2.1.下载spring-framework. 3

2.2.新建一个Web项目HelloSpring.. 3

2.3. 添加Spring到项目中... 4

2.4.编写两个Java类以供测试... 6

2.5.修改核心配置文件... 8

2.6.编写测试类Test.java. 10

2.7.添加一个File名为log4j.properties的文件... 11

2.8.测试运行... 12

2.9. 添加工具类AdviceUtil.java. 12

2.10.修改配置文件... 13

2.11.再次运行测试类... 16

三、测试过程出现的问题与解决方法... 17

四、Spring框架原理总结... 18

 

 

 

一. Spring介绍

Spring是为了解决企业级应用开发的复杂性而创建的,使用Spring可以让简单的JavaBean实现之前只有EJB才能完成的事情。但Spring不仅仅局限于服务器端开发,任何Java应用都能在简单性、可测试性和松耦合等方面从Spring中获益。

Spring的目标:致力于全方位的简化Java开发。

为了降低Java开发的复杂性,Spring采取了以下4个关键策略:

1)基于POJO的轻量级和最小侵入性编程

2)通过依赖注入和面向接口实现松耦合

3)基于切面和惯例进行声明式编程

4)通过切面和模板减少样板式代码

Spring可以做很多事情,为企业级开发提供给了丰富的功能,这些功能的底层都依赖于他的两个核心特性,也就是依赖注入(DI,dependency injection)和面向切面编程(AOP,aspect-oriented programming)。

DI,大概是说我们所需要的对象,由 Spring 提供并注入到我们要使用的地方。其中有的地方也称为IoC(Inversion of Control) 指控制反转,意思是在Spring框架中我们通过配置创建类对象,由Spring在运行阶段实例化、组装对象。

AOP大概是在执行某些代码前执行另外的代码,使程序更灵活、扩展性更好,可以随便地添加、删除某些功能。

Spring同时也是一个“一站式”框架,即Spring在JavaEE的三层架构[表现层(Web层)、业务逻辑层(Service层)、数据访问层(DAO层)]中,每一层均提供了不同的解决技术。如下:

  1. 表现层(Web层):Spring MVC
  2. 业务逻辑层(Service层):Spring的IoC
  3. 数据访问层(DAO层):Spring的jdbcTemplate

二. MyEclipse 10.7下搭建Spring框架

下面在MyEclipse10.7 环境下搭建入门Demo的Spring框架。

2.1.下载spring-framework

我用的版本是spring-framework-4.3.0.RELEASE-dist,推荐在这里下载:http://repo.spring.io/release/org/springframework/spring/,里面有各种版本的安装包。

解压后在lib文件夹中存放所有的jar包。

实现Spring最基本的功能时,导入四个核心jar包就可以了,分别为Beans、Core、Context和SpEL,另外还需要导入日志输出的jar包。

2.2.新建一个Web项目HelloSpring

File->New->Web Project.

2.3. 添加Spring到项目中

方法一:右击工程名,MyEclipse->Add Spring Capabilities.

这里Spring选最高的3.1,其他的默认,Next。

核心配置文件默认存放在工程的src目录下,默认文件名为applicationContext.xml。 Finish。

方法二:手动导入jar包并创建核心配置文件放在src目录下

<?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:p="http://www.springframework.org/schema/p"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">

</beans>

这段核心配置文件代码是使用MyEclipse内置的Spring自动创建的。如果Spring的版本不是3.1需要把第6行的3.1改为对应版本号,避免出错。

至此Spring框架搭建完毕。

2.4.编写两个Java类以供测试

Person.java

package com.spring.test;


/**

 * 人

 * @author fzhiy

 */

public class Person {

private String name;

private String context;


public String getName() {

return name;

}


public Person(String name, String context) {

this.name = name;

this.context = context;

}


public String getContext() {

return context;

}


public void say() {

System.out.println(name + " " + context);

}

}

Show.java

package com.spring.test;

/**

 * 展示

 * @author fzhiy

 */

public class Show {

private Person person;


public Person getPerson() {

return person;

}


public void setPerson(Person person) {

this.person = person;

}


public void show() {

person.say();

}

}

2.5.修改核心配置文件

将以下内容复制到配置文件中

<?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:p="http://www.springframework.org/schema/p"

       xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">


<!-- 下面这个bean标签 相当于 Person person = new Person("Hello", "Spring"); -->

       <bean id="person" class="com.spring.test.Person">

              <constructor-arg value="Hello" /><!-- DI中的构造器注入 -->

              <constructor-arg value="Spring" />

              <!-- value属性:Person类中setter方法中的参数对应的值 -->

       </bean>

       <!-- 下面这一句相当于 Show show = new Show(); -->

       <bean id="show" class="com.spring.test.Show">

              <!-- 下面这一句相当于 show.setPerson(person); -->

              <property name="person" ref="person" /><!-- DI中的属性注入 -->

              <!-- ref属性 : 引用id为person的配置 -->

       </bean>

</beans>

bean标签定义了 一个对象,id 属性是唯一标识且不可重复,class 属性表示这个对象所在的类,需要填写完整路径。

property 标签表示对象的属性,name 属性填写属性名,value 为基本类型的值,ref 表示引用其他的 bean。需要有对应属性的 seter 方法,否则会报错。

通过配置文件,Spring 就会知道我们需要几个对象,该给对象的什么属性赋什么值,就可以在我们需要的时候提供给我们。

在这个配置文件中体现了DI中两种注入方式:构造器注入和属性注入。

2.6.编写测试类Test.java

package com.spring.test;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

/**

 * 测试

 * @author fzhiy

 */

public class Test {

public static void main(String[] args) {

ApplicationContext context = new ClassPathXmlApplicationContext(

                            "applicationContext.xml");

              Show show = (Show) context.getBean("show");

              show.show();

              /*Person person = new Person("Hello", "Spring");

              Show show = new Show();

              show.setPerson(person);

              show.show();*/

}

}

ApplicationContext 是一个接口,负责读取 Spring 配置文件,管理对象加载、生命,维护 Bean 对象与 Bean 对象之间的依赖关系,负责 Bean 的生命周期等。

ClassPathXmlApplicaionContext 是 ApplicationContext 接口的实现类,用于从 classpath 路径中读取 Spring 配置文件。

getBean 方法用于获取 bean 对象,参数是 bean 对象的 id,返回的是 Object 类型的所以需要强制转换一下。

2.7.添加一个File名为log4j.properties的文件

后面会在解决问题部分说明添加 原因。

添加内容如下:

# Configure logging for testing: optionally with log file

log4j.rootLogger=WARN, stdout

# log4j.rootLogger=WARN, stdout, logfile

log4j.appender.stdout=org.apache.log4j.ConsoleAppender

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n

log4j.appender.logfile=org.apache.log4j.FileAppender

log4j.appender.logfile.File=target/spring.log

log4j.appender.logfile.layout=org.apache.log4j.PatternLayout

log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n

2.8.测试运行

结果如下:

以上是IoC的简单使用。

2.9. 添加工具类AdviceUtil.java

package com.spring.util;

/**

 * 通知工具类

 *

 * @author fzhiy

 *

 */

public class AdviceUtil {

public void before() {

System.out.println("这是前置通知");

}

public void after() {

System.out.println("这是后置通知");

}

}

2.10.修改配置文件

<?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:aop="http://www.springframework.org/schema/aop"

xmlns:p="http://www.springframework.org/schema/p"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd

    http://www.springframework.org/schema/aop

    http://www.springframework.org/schema/aop/spring-aop-3.1.xsd">

<!-- 下面这个bean标签 相当于 Person person = new Person("Hello", "Spring"); -->

       <bean id="person" class="com.spring.test.Person">

              <constructor-arg value="Hello" /><!-- DI中的构造器注入 -->

              <constructor-arg value="Spring" />

              <!-- value属性:Person类中setter方法中的参数对应的值 -->

       </bean>



       <!-- 下面这一句相当于 Show show = new Show(); -->

       <bean id="show" class="com.spring.test.Show">

              <!-- 下面这一句相当于 show.setPerson(person); -->

              <property name="person" ref="person" /><!-- DI中的属性注入 -->

              <!-- ref属性 : 引用id为person的配置 -->

       </bean>

<bean id="util" class="com.spring.util.AdviceUtil"></bean>

<aop:config>

<aop:pointcut expression="execution(* com.spring.test.Show.show())"

id="pointcut" /><!-->

              <!-- <aop:config> 标签包含与AOP相关的配置。 aop:pointcut 声明切面,表示在什么地方,id 为唯一标识符, expression

配置切入点表达式,execution 声明切入点,括号中是一个切点表达式,用来匹配符合条件的方法。 -->

<aop:aspect ref="util">

<aop:before method="before" pointcut-ref="pointcut" />

<aop:after method="after" pointcut-ref="pointcut" />

</aop:aspect>

</aop:config>

</beans>

       注意这里的<beans>标签中添加了AOP后Spring所需要加载的xsd文件。也就是xsi:schemaLocation部分。

aop:aspect 使用 ref 引用含有通知方法的 bean。

aop:before 声明前置通知,aop:after-renturning声明后置通知。method 属性表示调用的通知方法,pointcut-ref 引用 pointcut 切入点。

上面用到了Spring切入点expression表达式:expression="execution(* com.spring.test.Show.show())"

这个表达式的意思是执行com.spring.test包下的Show类的show(),返回任意类型。

Spring切入点的expression表达式的格式如下:

execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern)

throws-pattern?)

除了返回类型模式(上面代码片断中的ret-type-pattern),名字模式和参数模式以外, 所有的部分(也就是带有?)都是可选的。

返回类型模式决定了方法的返回类型必须依次匹配一个连接点。 使用的最频繁的返回类型模式是*,它代表了匹配任意的返回类型。 一个全限定的类型名将只会匹配返回给定类型的方法。

名字模式匹配的是方法名。 你可以使用*通配符作为所有或者部分命名模式。

参数模式稍微有点复杂:()匹配了一个不接受任何参数的方法, 而(..)匹配了一个接受任意数量参数的方法(零或者更多)。 模式(*)匹配了一个接受一个任何类型的参数的方法。 模式(*,String)匹配了一个接受两个参数的方法,第一个可以是任意类型, 第二个则必须是String类型。

2.11.再次运行测试类

结果如下:

第二个小测试展示了Spring的切面的两种通知类型:AOP编程的前置通知和后置通知。当然,切面通知还有其他类型。

前置通知(Before):在目标方法被调用之前调用通知功能;

后置通知(After):在目标方法完成之后调用通知,此时不会关心方法的输出是什么;

返回通知(After-returning):在目标方法成功执行之后调用通知;

异常通知(After-throwing):在目标方法抛出异常后调用通知;

环绕通知(Around):通知包裹了被通知的方法,在被通知的方法调用之前和调用之后执行自定义的行为。

当然,AOP还有更多其他的特性,这里不再深入说明。

到这里,Spring框架的两个重要特性的Demo已经写完了。

三、测试过程出现的问题与解决方法

3.1在2.7中添加了一个日志文件log4j.properties。

原因:如果不添加这个文件,在打印Hello Spring的同时会出现log4j警告。log4j无法输出日志,log4j是一个日志输入软件包。可以将Struts或Hibernate等压缩包解压,内有log4j.properties文件,将它复制到项目src文件夹或将log4j.properties放到 \WEB-INF\classes文件夹中即可。

解决方法在2.7已写出。

3.2 在测试Spring的第二个特性AOP,也就是第二次修改核心配置文件时,beans标签多了AOP的xsd文件

       原因: Spring默认在启动的时候要加载XSD文件来验证XML文件,如果在xsi:schemaLocation不加入AOP对应的XSD文件会出现错误

这里简要说明下xml的概念:

XML的元素名字是不固定的,当两个不同的文档使用同样的名称描述两个不同类型的元素的时候,或者一个同样的标记表示两个不同含义的内容的时候,就会发生命名冲突。

所以采用现成的在全球唯一的“域名”作为Namespace,即URL作为XML的NameSpace,从而解决命名冲突。

语法格式:xmlns:[prefix]=”[url of name]”

其中“xmlns:”是必须的属性。“prefix”是命名空间的别名,它的值不能为xml。

schemaLocation提供了一个xml namespace到对应的XSD文件的一个映射,所以我们可以看到,在xsi:schemaLocation后面配置的字符串都是成对的,前面的是namespace的URI,后面是XSD文件的URI

Spring把XSD文件放到本地了,再在spring.schemas里做了一个映射,优先从本地里加载XSD文件。所以如果加入XSD的话Spring会启动不了,出现错误。

四、Spring框架原理总结

1.使用spring,不用我们创建对象,我们把创建对象的任务交给spring框架
2.spring实际上是一个容器框架,可以配置各种bean(action/service/domain/dao),并且可以维护bean与bean的关系,当我们需要使用某个bean的时候,我们可以getBean(id),使用即可.

 

参考:

https://www.cnblogs.com/jbelial/archive/2012/06/05/2536814.html

 

 

 

 

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值