下面这个系列是非常好的例子:

http://www.yiibai.com/spring/spring-3-hello-world-example.html

正在看,把一些基础夯实。

IoC可以从下面一篇开始看(前面几篇的bean配置也需要看,是基础):

http://www.yiibai.com/spring/spring-dependency-injection-di.html

AOP可以从下面一篇开始看:

http://www.yiibai.com/spring/spring-aop-examples-advice.html

开始写代码实验各种效果:

实验1(简单利用ApplicationContext)http://www.yiibai.com/spring/spring-3-hello-world-example.html:

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>com.myapp</groupId>
<artifactId>springdemo</artifactId>
<version>1.0-SNAPSHOT</version> <dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.2.RELEASE</version>
</dependency> <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.2.RELEASE</version>
</dependency> </dependencies> </project>

resources里面方applicationContext.xml

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean id="helloBean" class="com.myapp.springdemo.Hello">
<property name="name" value="Here"/>
</bean> </beans>

src/main/java里面建package:com.myapp.springdemo,然后有两个class,分别是

Hello.java

package com.myapp.springdemo;

/**
* Created by baidu on 16/10/20.
*/
public class Hello {
private String name;
public void setName(String name) {
this.name = name;
}
public void printHello() {
System.out.printf("Hello is %s\n", name);
}
}

SpringDemo.java

package com.myapp.springdemo;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; /**
* Created by baidu on 16/10/20.
*/
public class SpringDemo {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Hello obj = (Hello) context.getBean("helloBean");
obj.printHello();
}
}

然后运行,成功:

十月 20, 2016 2:27:20 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@7a07c5b4: startup date [Thu Oct 20 14:27:20 CST 2016]; root of context hierarchy
十月 20, 2016 2:27:20 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [applicationContext.xml]
Hello is Here Process finished with exit code 0

实验2(松耦合,通过xml配置class之间的依赖关系)http://www.yiibai.com/spring/spring-loosely-coupled-example.html

pom.xml不变。

resources/applicationContext.xml

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean id="helloBean" class="com.myapp.springdemo.Hello">
<property name="outputGenerator" ref="CsvOutputGenerator"/>
</bean> <bean id="CsvOutputGenerator" class="com.myapp.springdemo.CsvOutputGenerator"/> </beans>

还有另一种写法,把property的ref单独提出来:

<bean id="helloBean" class="com.myapp.springdemo.Hello">
<property name="outputGenerator">
<ref local="CsvOutputGenerator"/>
</property>
</bean>
上面的local也可以写成bean。
其实,无论是在相同或不同的XML文件,“ref” 标签可以访问一个bean,但是,对于该项目的可读性,如果引用了相同的 XML文件中声明 bean,您应该使用“local”属性。

SpringDemo.java

package com.myapp.springdemo;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; /**
* Created by baidu on 16/10/20.
*/
public class SpringDemo {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Hello obj = (Hello) context.getBean("helloBean");
obj.printHello();
}
}

Hello.java

package com.myapp.springdemo;

/**
* Created by baidu on 16/10/20.
*/
public class Hello {
private IOutputGenerator outputGenerator; public void setOutputGenerator(IOutputGenerator outputGenerator) {
this.outputGenerator = outputGenerator;
}
public void printHello() {
this.outputGenerator.print();
}
}

IOutputGenerator.java

package com.myapp.springdemo;

/**
* Created by baidu on 16/10/20.
*/
public interface IOutputGenerator {
public void print();
}

CsvOutputGenerator.java

package com.myapp.springdemo;

/**
* Created by baidu on 16/10/20.
*/
public class CsvOutputGenerator implements IOutputGenerator{
public void print() {
System.out.printf("Here is csv output\n");
}
}

运行,成功。

十月 20, 2016 2:42:20 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@7a07c5b4: startup date [Thu Oct 20 14:42:20 CST 2016]; root of context hierarchy
十月 20, 2016 2:42:21 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [applicationContext.xml]
Here is csv output Process finished with exit code 0

下面,再试一下AOP的内容:

在Spring AOP中,有 4 种类型通知(advices)的支持:
通知(Advice)之前 - 该方法执行前运行
通知(Advice)返回之后 – 运行后,该方法返回一个结果
通知(Advice)抛出之后 – 运行方法抛出异常后,
环绕通知 – 环绕方法执行运行,结合以上这三个通知。

实验1(在方法前执行)http://www.yiibai.com/spring/spring-aop-examples-advice.html:

增加一个 HijackMethod.java,注意是要实现MethodBeforeAdvice接口的方法:

package com.myapp.springdemo;

import org.springframework.aop.MethodBeforeAdvice;

import java.lang.reflect.Method;

/**
* Created by baidu on 16/10/20.
*/
public class HijackMethod implements MethodBeforeAdvice{ public void before(Method method, Object[] objects, Object o) throws Throwable {
System.out.println("HijackBeforeMethod");
}
}

其他的文件,为了实验需要,稍作修改。

CsvOutputGenerator.java

package com.myapp.springdemo;

/**
* Created by baidu on 16/10/20.
*/
public class CsvOutputGenerator implements IOutputGenerator{
public void printHello() {
System.out.printf("Here is csv output\n");
} public void printBye() {
System.out.printf("Byebye in csv output\n");
}
}

Hello.java

package com.myapp.springdemo;

/**
* Created by baidu on 16/10/20.
*/
public class Hello {
private IOutputGenerator outputGenerator; public void setOutputGenerator(IOutputGenerator outputGenerator) {
this.outputGenerator = outputGenerator;
}
public void print() {
System.out.println("*************************");
this.outputGenerator.printHello();
System.out.println("*************************");
this.outputGenerator.printBye();
System.out.println("*************************");
}
}

IOutputGenerator.java

package com.myapp.springdemo;

/**
* Created by baidu on 16/10/20.
*/
public interface IOutputGenerator {
public void printHello();
public void printBye();
}

在applicationContext.xml里面需要进行配置:

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean id="helloBean" class="com.myapp.springdemo.Hello">
<property name="outputGenerator">
<ref local="CsvOutputGenerator"/>
</property>
</bean> <bean id="hijackMethodBean" class="com.myapp.springdemo.HijackMethod"/> <bean id="helloProxyBean" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="helloBean"/>
<property name="interceptorNames">
<list>
<value>hijackMethodBean</value>
</list>
</property>
</bean> <bean id="CsvOutputGenerator" class="com.myapp.springdemo.CsvOutputGenerator"/> </beans>

然后主文件的调用部分修改成调用Proxy:

package com.myapp.springdemo;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; /**
* Created by baidu on 16/10/20.
*/
public class SpringDemo {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//Hello obj = (Hello) context.getBean("helloBean");
Hello obj = (Hello) context.getBean("helloProxyBean");
obj.print();
}
}

运行,得到结果:

十月 20, 2016 3:11:11 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@7a07c5b4: startup date [Thu Oct 20 15:11:11 CST 2016]; root of context hierarchy
十月 20, 2016 3:11:11 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [applicationContext.xml]
HijackBeforeMethod
*************************
Here is csv output
*************************
Byebye in csv output
************************* Process finished with exit code 0

这时候,发现"HijackBeforeMethod"打印在了"***"前面。这时候发现,我们的AoP是做在了Hello这个class,所以是在Hello的方法print之前进行了Advice的调用。修改一下xml配置:

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean id="helloBean" class="com.myapp.springdemo.Hello">
<property name="outputGenerator">
<ref local="outputProxyBean"/>
</property>
</bean> <bean id="hijackMethodBean" class="com.myapp.springdemo.HijackMethod"/> <bean id="outputProxyBean" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="CsvOutputGenerator"/>
<property name="interceptorNames">
<list>
<value>hijackMethodBean</value>
</list>
</property>
</bean> <bean id="CsvOutputGenerator" class="com.myapp.springdemo.CsvOutputGenerator"/> </beans>

然后在主函数里面把调用改回原来的class:

package com.myapp.springdemo;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; /**
* Created by baidu on 16/10/20.
*/
public class SpringDemo {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
//Hello obj = (Hello) context.getBean("helloBean");
Hello obj = (Hello) context.getBean("helloBean");
obj.print();
}
}

运行,得到结果:

十月 20, 2016 3:19:34 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@7a07c5b4: startup date [Thu Oct 20 15:19:34 CST 2016]; root of context hierarchy
十月 20, 2016 3:19:34 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [applicationContext.xml]
*************************
HijackBeforeMethod
Here is csv output
*************************
HijackBeforeMethod
Byebye in csv output
************************* Process finished with exit code 0

实验2,环绕AOP,包括了前、后、异常的处理,http://www.yiibai.com/spring/spring-aop-examples-advice.html 最后一部分。

增加一个 HijackAroundMethod.java,需要实现 MethodInterceptor接口的方法,而不是之前的MethodBeforeAdvice接口的方法:

package com.myapp.springdemo;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation; import java.util.Arrays;
import java.util.IllegalFormatCodePointException; /**
* Created by baidu on 16/10/20.
*/
public class HijackAroundMethod implements MethodInterceptor{
public Object invoke(MethodInvocation methodInvocation) throws Throwable {
System.out.println("Method name: " + methodInvocation.getMethod().getName());
System.out.println("Method args: " + Arrays.toString(methodInvocation.getArguments())); System.out.println("Before Method"); try {
Object result = methodInvocation.proceed();
System.out.println("After Method");
return result;
} catch (IllegalArgumentException e) {
System.out.println("Catch Exception for Method");
throw e;
} }
}

然后其他的java代码都不用变,只需要修改applicationContext.xml配置文件里面关于拦截器Interceptor的bean映射class的内容,只需要改一行:

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean id="helloBean" class="com.myapp.springdemo.Hello">
<property name="outputGenerator">
<ref local="outputProxyBean"/>
</property>
</bean> <bean id="hijackMethodBean" class="com.myapp.springdemo.HijackAroundMethod"/> <bean id="outputProxyBean" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="CsvOutputGenerator"/>
<property name="interceptorNames">
<list>
<value>hijackMethodBean</value>
</list>
</property>
</bean> <bean id="CsvOutputGenerator" class="com.myapp.springdemo.CsvOutputGenerator"/> </beans>

只需要修改上面飘红的那一行。然后运行,得到:

十月 20, 2016 3:29:10 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@7a07c5b4: startup date [Thu Oct 20 15:29:10 CST 2016]; root of context hierarchy
十月 20, 2016 3:29:10 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [applicationContext.xml]
*************************
Method name: printHello
Method args: []
Before Method
Here is csv output
After Method
*************************
Method name: printBye
Method args: []
Before Method
Byebye in csv output
After Method
************************* Process finished with exit code 0

实验3,只对部分函数进行拦截,http://www.yiibai.com/spring/spring-aop-example-pointcut-advisor.html 后面一部分:

修改xml配置,要用到"org.springframework.aop.support.NameMatchMethodYiibaicut"(新版已经改成NameMatchMethodPointcut)

在Spring AOP中,有三个非常专业术语- Advices, Yiibaicut , Advisor,把它在非官方的方式...
Advice – 指示之前或方法执行后采取的行动。
Yiibaicut – 指明哪些方法应该拦截,通过方法的名称或正则表达式模式。
Advisor – 分组"通知"和”切入点“成为一个单元,并把它传递到代理工厂对象。

要对部分函数进行拦截,就要用到上面的概念。只需要修改xml配置文件即可,不需要改代码:

applicationContext.xml

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean id="helloBean" class="com.myapp.springdemo.Hello">
<property name="outputGenerator">
<ref local="outputProxyBean"/>
</property>
</bean> <bean id="hijackMethodBean" class="com.myapp.springdemo.HijackAroundMethod"/> <bean id="customerYiibaicut" class="org.springframework.aop.support.NameMatchMethodPointcut">
<property name="mappedName" value="printBye"/>
</bean> <bean id="outputAdvisor" class="org.springframework.aop.support.DefaultPointcutAdvisor">
<property name="pointcut" ref="customerYiibaicut"/>
<property name="advice" ref="hijackMethodBean"/>
</bean> <bean id="outputProxyBean" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="CsvOutputGenerator"/>
<property name="interceptorNames">
<list>
<value>outputAdvisor</value>
</list>
</property>
</bean> <bean id="CsvOutputGenerator" class="com.myapp.springdemo.CsvOutputGenerator"/> </beans>

在上面的文件中,可以看出,增加了一个"NameMatchMethodPointcut"的bean,再增加一个"DefaultPointcutAdvisor"的bean把这个Pointcut的过滤条件,和之前的advice “hijackMethodBean”关联起来。然后在“ProxyFactoryBean”里面把之前的advice换成这个advisor即可。

运行,得到结果:

十月 20, 2016 3:50:57 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@7a07c5b4: startup date [Thu Oct 20 15:50:57 CST 2016]; root of context hierarchy
十月 20, 2016 3:50:57 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [applicationContext.xml]
*************************
Here is csv output
*************************
Method name: printBye
Method args: []
Before Method
Byebye in csv output
After Method
************************* Process finished with exit code 0

如果要拦截多个方法,xml里面可以这样写:

<bean id="customerYiibaicut" class="org.springframework.aop.support.NameMatchMethodPointcut">
<property name="mappedNames">
<list>
<value>printHello</value>
<value>printBye</value>
</list>
</property>
</bean>

运行,得到结果:

十月 20, 2016 3:55:54 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@7a07c5b4: startup date [Thu Oct 20 15:55:54 CST 2016]; root of context hierarchy
十月 20, 2016 3:55:54 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [applicationContext.xml]
*************************
Method name: printHello
Method args: []
Before Method
Here is csv output
After Method
*************************
Method name: printBye
Method args: []
Before Method
Byebye in csv output
After Method
************************* Process finished with exit code 0

或者可以用patter匹配的方法(注意,改的是Advisor,而Pointcut可以不用了):

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean id="helloBean" class="com.myapp.springdemo.Hello">
<property name="outputGenerator">
<ref local="outputProxyBean"/>
</property>
</bean> <bean id="hijackMethodBean" class="com.myapp.springdemo.HijackAroundMethod"/> <bean id="outputAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
<property name="patterns">
<list>
<value>.*print.*</value>
</list>
</property>
<property name="advice" ref="hijackMethodBean"/>
</bean> <bean id="outputProxyBean" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target" ref="CsvOutputGenerator"/>
<property name="interceptorNames">
<list>
<value>outputAdvisor</value>
</list>
</property>
</bean> <bean id="CsvOutputGenerator" class="com.myapp.springdemo.CsvOutputGenerator"/> </beans>

在上面文件中,使用pattern advisor的话,原来的"NameMatchPointcut"的bean不用了可以删去;创建一个RegexMethodPointcutAdvisor的bean,里面的property方面不再使用上个例子上的pointcut,而是配上新的property:patterns,注意patterns里面写的".*print.*"前面的.*也一定要加上,不加上的话不能匹配,可能是因为在方法名前面有调用的前缀吧,虽然打印出来的方法名称的确从print开始。运行,得到结果:

十月 20, 2016 4:01:59 下午 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@7a07c5b4: startup date [Thu Oct 20 16:01:59 CST 2016]; root of context hierarchy
十月 20, 2016 4:01:59 下午 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
信息: Loading XML bean definitions from class path resource [applicationContext.xml]
*************************
Method name: printHello
Method args: []
Before Method
Here is csv output
After Method
*************************
Method name: printBye
Method args: []
Before Method
Byebye in csv output
After Method
************************* Process finished with exit code 0

(下面一小段可以忽略)

再回顾一下之前Pointcut的例子,对一个class里面的部分函数进行AOP,参考网页里面的配置:

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <bean id="customerService" class="com.yiibai.customer.services.CustomerService">
<property name="name" value="Yiibai" />
<property name="url" value="http://www.yiibai.com" />
</bean> <bean id="hijackAroundMethodBeanAdvice" class="com.yiibai.aop.HijackAroundMethod" /> <bean id="customerServiceProxy"
class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="target" ref="customerService" /> <property name="interceptorNames">
<list>
<value>customerAdvisor</value>
</list>
</property>
</bean> <bean id="customerYiibaicut"
class="org.springframework.aop.support.NameMatchMethodYiibaicut">
<property name="mappedName" value="printName" />
</bean> <bean id="customerAdvisor"
class="org.springframework.aop.support.DefaultYiibaicutAdvisor">
<property name="pointcut" ref="customerYiibaicut" />
<property name="advice" ref="hijackAroundMethodBeanAdvice" />
</bean> </beans>

里面还有一些其他的例子,比如Lucence:

http://www.yiibai.com/html/java/

最后,给一下全部目录:

Spring教程
Spring hello world实例
Spring松耦合实例
Spring JavaConfig实例
Spring JavaConfig @Import实例
Spring依赖注入(DI)
Spring使用Setter依赖注入
Spring通过构造方法依赖注入
Spring Bean引用例子
如何注入值到Spring bean属性
Spring bean加载多个配置文件
Spring内部bean实例
Spring Bean作用域实例
Spring集合 (List,Set,Map,Properties) 实例
Spring ListFactoryBean实例
Spring SetFactoryBean实例
Spring MapFactoryBean例子
Spring注入日期到bean属性-CustomDateEditor
Spring PropertyPlaceholderConfigurer实例
Spring bean配置继承
Spring依赖检查
Spring使用@Required注解依赖检查
Spring自定义@Required-style注解
Spring Bean InitializingBean和DisposableBean实例
Spring Bean init-method 和 destroy-method实例
Spring @PostConstruct和@PreDestroy实例
Spring EL hello world实例
Spring EL bean引用实例
Spring EL方法调用实例
Spring EL运算符实例
Spring EL三元运算(if-then-else)实例
Spring EL Lists,Maps实例
Spring EL正则表达式实例
Spring自动扫描组件
Spring过滤器组件自动扫描
Spring自动装配Beans
Spring AOP通知实例 – Advice
Spring AOP实例(Pointcut,Advisor)
Spring自动代理创建者实例
Spring AOP+AspectJ注解实例
Spring Object到XML映射实例
Spring+JDBC实例
Spring JdbcTemplate+JdbcDaoSupport实例
Spring JdbcTemplate查询实例
Spring SimpleJdbcTemplate查询示例
Spring SimpleJdbcTemplate类命名参数实例
Spring+Hibernate+MySql实例
Spring AOP在Hibernate事务管理
Spring在bean配置文件中定义电子邮件模板
Spring发送带附件邮件
Spring依赖注入servlet会话监听器
Spring资源捆绑ResourceBundleMessageSource示例
Spring初学快速入门
Spring+JDBC实例

最新文章

  1. html小技巧
  2. 升级Windows 10 正式版过程记录与经验
  3. 网盘的选择,百度网盘、google drive 还是 Dropbox
  4. Unicode 转成中文
  5. Java Code Examples for javax.servlet.http.Part
  6. Oracle_双机备份
  7. Mac terminal 解压压缩
  8. 【BZOJ】1295: [SCOI2009]最长距离(spfa+暴力)
  9. 关于后台管理linkbutton按钮几个重要属性的理解
  10. FaceBook Twitter实习生简历求内推
  11. eclipse 开发技巧
  12. 13个Cat命令管理文件实例汇总
  13. 原创新闻 11 个最佳 jQuery 滚动条插件
  14. 201521123088《JAVA程序设计》第5周学习总结
  15. [C++]头文件&lt;algorithm&gt;
  16. Tp5自动验证
  17. mac pro 如何让终端默认运行python3.X而不是2.7
  18. wordpress +window 走起~
  19. docker教程——docker镜像打包上传
  20. win10中打开SQL Server配置管理器方法

热门文章

  1. POJ2186 (强连通分量缩点后出度为0的分量内点个数)
  2. python基础===python内置函数大全
  3. Smith-Waterman算法及其Java实现
  4. tcpdump学习(1):安装
  5. [BZOJ4568][Scoi2016]幸运数字 倍增+线性基
  6. 《javascript高级程序设计》读书小延伸
  7. HDU 1181.变形课-并查集
  8. 1957 Problem F 乌鸦坐飞机
  9. The 15th Zhejiang Provincial Collegiate Programming Contest Sponsored by TuSimple - J CONTINUE...?
  10. POJ 1741 Tree (点分治)