- 浏览: 508740 次
- 性别:
- 来自: 长沙
文章分类
最新评论
-
wang1352083:
正在搭建tomcat源码.一会儿参照楼主经验搭建spring源 ...
Eclipse中阅读开源项目代码 -
w123456789zzzz:
谢谢你,问题解决了,楼主万岁!!
eclipse中如何安装插件 -
xiaoLee:
...
软件性能测试论文草稿 -
铃儿响叮当:
...
使用firefox调试js -
gogopengyou:
很细心啊
eclipse中如何安装插件
Hibernate之后就迎来了Spring, ^_^ ^_^ 不过此处据说是让人看不到春天的。
Spring框架的特点:
1、 黏合剂: 面向组件开发的技术, Spring提供了对已有的各种组件技术的融合。
2、 轻量级的框架: 指应用程序基于框架开发依赖于API的严重程度低(这样子学习成本低 且 便于框架更换)。
都说学习Spring没什么新东西, 主要的就是学习一些思想。 因此今天我便开始学习了IOC思想。
IOC降低了面向对象编程对象之间的耦合度, 学习IOC主要要注意两个方面的问题:
a、 控制什么: 对象之间的依赖关系是什么
b、 反转到哪里
————IOC容器主要做了两项工作:
a、 创建对象
b、 根据对象之间的依赖关系进行注入——使用属性的get()/set()方法 或者使用构造函数。
重点是applicationContext.xml文件的配置, 多练习....
Spring & AOP ——————面向切面编程
切面: 和业务逻辑的核心实现没有关系, 但业务逻辑的实现需要某个领域提供相应的服务(如炒菜与洗菜,刷锅)。
在学习AOP时重点提到了代理模式: 代理模式的用途在于为真正的对象提供一个服务。
代理模式又分为静态代理与动态代理, 静态代理只为某一种对象提供服务, 而动态代理可以为不同类型接口类型的对象提供服务。
代理模式中存在三种角色, 分别是 真实对象、 代理对象、 一个真实对象和代理对象的接口
——————————————如下贴出我写的AOP练习 (以 洗菜——炒菜——洗碗 为例)
A、 不使用代理模式:
public class Worker {
public void beforeWork()
{
System.out.println("炒菜准备工作");
}
public void doWork()
{
beforeWork();
System.out.println("正在炒菜.....");
afterWork();
}
public void afterWork()
{
System.out.println("洗碗工作");
}
}
不使用代理模式有一个很大的弊端就是每次炒菜时都得重复地调用beforeWork()与afterWork()方法, 这样子造成了代码冗余
B、 使用静态代理模式:
CookInterface.java ——真实对象与代理对象的共同接口
public interface CookInterface {
public void doCooking();
}
CookImpl.java ——真实对象, 实现炒菜这个核心业务
public class CookImpl implements CookInterface{
public void doCooking() {
System.out.println("正在炒菜....");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
CookProxy.java ——代理对象
public class CookProxy implements CookInterface{ //代理对象与真实对象实现同一个接口
CookInterface cooker;
public CookInterface getCooker() {
return cooker;
}
public void setCooker(CookInterface cooker) {
this.cooker = cooker;
}
public void doCooking() {
beforeWork();
cooker.doCooking();
afterWork();
}
/**
* 将为核心业务服务的方法抽取到代理对象中
*
*/
public void beforeWork(){
System.out.println("洗菜");
}
public void afterWork(){
System.out.println("洗碗");
}
}
TestAop.java ——测试类
public class TestAop {
public static void main(String[] args) {
CookInterface cooker = new CookImpl();
CookProxy cookerProxy = new CookProxy();
cookerProxy.setCooker(cooker);
cookerProxy.doCooking();
}
}
静态代理模式虽然减少了代码冗余, 但是其只能为实现某一种类型接口的特定对象提供服务
C、 动态代理: (动态代理类与测试类发生了变化, 其他两个类同上)
CookDynamicProxy.java ——动态代理类
/**
* 为不同接口类型的对象动态产生代理对象
* @author Administrator
*
*/
public class CookDynamicProxy implements InvocationHandler{
private Object targetObject; //真实对象
/**
* 动态产生代理对象
*/
public Object createProxyObject(Object targetObject){
this.targetObject = targetObject;
return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),
targetObject.getClass().getInterfaces(), this);
}
/**
* 提供代理的服务(切面)
* proxy是代理对象
* method是代理对象调用的方法
* args是调用方法的实参列别
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
beforeWork();
//调用真实对象的方法
Object result = method.invoke(targetObject, args);
afterWork();
return result;
}
public void beforeWork(){
System.out.println("洗菜");
}
public void afterWork(){
System.out.println("洗碗");
}
}
TestDynamicProxy.java
public class TestDynamicProxy {
public static void main(String[] args) {
CookInterface cooker = new CookImpl();
CookInterface cookerProxy = (CookInterface)new CookDynamicProxy().createProxyObject(cooker);
cookerProxy.doCooking();
}
}
这样子就与具体的接口解耦了。 ^_^ ^_^ 这是一种比较好的做法。
D、 在Spring中使用动态代理模式, 通过配置appicationContext.xml以及调用Spring API的方式实现
这种方式主要是配置applicationContext.xml, 如下是我的配置:
<!-- 配置真实对象 -->
<bean id="realWorker" class="cn.com.aop.CookImpl"></bean>
<!-- 配置通知 -->
<bean id="arroundNote" class="cn.com.aop.ArroundLog"></bean>
<!-- 配置动态代理 -->
<bean id="workProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<!-- 指定要实现的接口 -->
<property name="interfaces"><value>cn.com.aop.CookInterface</value></property>
<!-- 指定代理的真实对象 -->
<property name="target" ref="realWorker"></property>
<!-- 指定运行时织入的通知 -->
<property name="interceptorNames">
<list>
<value>arroundNote</value>
</list>
</property>
</bean>
关于源文件只有如下两个与上面的源文件不同, 列举如下:
ArroungLog.java ——通知
/**
* 切面代码,在方法的前后进行织入
* @author Administrator
*
*/
public class ArroundLog implements MethodInterceptor {
public Object invoke(MethodInvocation arg0) throws Throwable {
beforeWork();
Object result = arg0.proceed();
afterWork();
return result;
}
public void beforeWork(){
System.out.println("洗菜");
}
public void afterWork(){
System.out.println("洗碗");
}
}
Test.java ——测试类
public class Test {
public static void main(String[] args) {
Resource resource = new ClassPathResource("applicationContext.xml");
BeanFactory bf = new XmlBeanFactory(resource);
CookInterface cooker = (CookInterface)bf.getBean("workProxy");
cooker.doCooking();
}
}
Spring框架的特点:
1、 黏合剂: 面向组件开发的技术, Spring提供了对已有的各种组件技术的融合。
2、 轻量级的框架: 指应用程序基于框架开发依赖于API的严重程度低(这样子学习成本低 且 便于框架更换)。
都说学习Spring没什么新东西, 主要的就是学习一些思想。 因此今天我便开始学习了IOC思想。
IOC降低了面向对象编程对象之间的耦合度, 学习IOC主要要注意两个方面的问题:
a、 控制什么: 对象之间的依赖关系是什么
b、 反转到哪里
————IOC容器主要做了两项工作:
a、 创建对象
b、 根据对象之间的依赖关系进行注入——使用属性的get()/set()方法 或者使用构造函数。
重点是applicationContext.xml文件的配置, 多练习....
Spring & AOP ——————面向切面编程
切面: 和业务逻辑的核心实现没有关系, 但业务逻辑的实现需要某个领域提供相应的服务(如炒菜与洗菜,刷锅)。
在学习AOP时重点提到了代理模式: 代理模式的用途在于为真正的对象提供一个服务。
代理模式又分为静态代理与动态代理, 静态代理只为某一种对象提供服务, 而动态代理可以为不同类型接口类型的对象提供服务。
代理模式中存在三种角色, 分别是 真实对象、 代理对象、 一个真实对象和代理对象的接口
——————————————如下贴出我写的AOP练习 (以 洗菜——炒菜——洗碗 为例)
A、 不使用代理模式:
public class Worker {
public void beforeWork()
{
System.out.println("炒菜准备工作");
}
public void doWork()
{
beforeWork();
System.out.println("正在炒菜.....");
afterWork();
}
public void afterWork()
{
System.out.println("洗碗工作");
}
}
不使用代理模式有一个很大的弊端就是每次炒菜时都得重复地调用beforeWork()与afterWork()方法, 这样子造成了代码冗余
B、 使用静态代理模式:
CookInterface.java ——真实对象与代理对象的共同接口
public interface CookInterface {
public void doCooking();
}
CookImpl.java ——真实对象, 实现炒菜这个核心业务
public class CookImpl implements CookInterface{
public void doCooking() {
System.out.println("正在炒菜....");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
CookProxy.java ——代理对象
public class CookProxy implements CookInterface{ //代理对象与真实对象实现同一个接口
CookInterface cooker;
public CookInterface getCooker() {
return cooker;
}
public void setCooker(CookInterface cooker) {
this.cooker = cooker;
}
public void doCooking() {
beforeWork();
cooker.doCooking();
afterWork();
}
/**
* 将为核心业务服务的方法抽取到代理对象中
*
*/
public void beforeWork(){
System.out.println("洗菜");
}
public void afterWork(){
System.out.println("洗碗");
}
}
TestAop.java ——测试类
public class TestAop {
public static void main(String[] args) {
CookInterface cooker = new CookImpl();
CookProxy cookerProxy = new CookProxy();
cookerProxy.setCooker(cooker);
cookerProxy.doCooking();
}
}
静态代理模式虽然减少了代码冗余, 但是其只能为实现某一种类型接口的特定对象提供服务
C、 动态代理: (动态代理类与测试类发生了变化, 其他两个类同上)
CookDynamicProxy.java ——动态代理类
/**
* 为不同接口类型的对象动态产生代理对象
* @author Administrator
*
*/
public class CookDynamicProxy implements InvocationHandler{
private Object targetObject; //真实对象
/**
* 动态产生代理对象
*/
public Object createProxyObject(Object targetObject){
this.targetObject = targetObject;
return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),
targetObject.getClass().getInterfaces(), this);
}
/**
* 提供代理的服务(切面)
* proxy是代理对象
* method是代理对象调用的方法
* args是调用方法的实参列别
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
beforeWork();
//调用真实对象的方法
Object result = method.invoke(targetObject, args);
afterWork();
return result;
}
public void beforeWork(){
System.out.println("洗菜");
}
public void afterWork(){
System.out.println("洗碗");
}
}
TestDynamicProxy.java
public class TestDynamicProxy {
public static void main(String[] args) {
CookInterface cooker = new CookImpl();
CookInterface cookerProxy = (CookInterface)new CookDynamicProxy().createProxyObject(cooker);
cookerProxy.doCooking();
}
}
这样子就与具体的接口解耦了。 ^_^ ^_^ 这是一种比较好的做法。
D、 在Spring中使用动态代理模式, 通过配置appicationContext.xml以及调用Spring API的方式实现
这种方式主要是配置applicationContext.xml, 如下是我的配置:
<!-- 配置真实对象 -->
<bean id="realWorker" class="cn.com.aop.CookImpl"></bean>
<!-- 配置通知 -->
<bean id="arroundNote" class="cn.com.aop.ArroundLog"></bean>
<!-- 配置动态代理 -->
<bean id="workProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
<!-- 指定要实现的接口 -->
<property name="interfaces"><value>cn.com.aop.CookInterface</value></property>
<!-- 指定代理的真实对象 -->
<property name="target" ref="realWorker"></property>
<!-- 指定运行时织入的通知 -->
<property name="interceptorNames">
<list>
<value>arroundNote</value>
</list>
</property>
</bean>
关于源文件只有如下两个与上面的源文件不同, 列举如下:
ArroungLog.java ——通知
/**
* 切面代码,在方法的前后进行织入
* @author Administrator
*
*/
public class ArroundLog implements MethodInterceptor {
public Object invoke(MethodInvocation arg0) throws Throwable {
beforeWork();
Object result = arg0.proceed();
afterWork();
return result;
}
public void beforeWork(){
System.out.println("洗菜");
}
public void afterWork(){
System.out.println("洗碗");
}
}
Test.java ——测试类
public class Test {
public static void main(String[] args) {
Resource resource = new ClassPathResource("applicationContext.xml");
BeanFactory bf = new XmlBeanFactory(resource);
CookInterface cooker = (CookInterface)bf.getBean("workProxy");
cooker.doCooking();
}
}
发表评论
-
性能问题
2013-09-04 20:13 0<SERVICE CLASS=" ... -
ant中使用svn检出代码
2011-05-14 21:33 2956[size=large][size=large][size=l ... -
Ant与批处理(win环境)学习3
2011-04-10 23:48 1212此篇主要讲实践,大多数情况下是直接贴的代码了 ... -
VNC之代理
2011-03-27 22:48 2771[size=large] 背景:使用VNC客户端去连接DC上 ... -
1号~15号工作日志
2011-01-16 22:23 8841、 Flex的includeInLayout属 ... -
JAVA异常处理
2011-01-11 22:51 696在je上看到一篇有关异常处理的文章,觉得还不错... . ... -
Java配置项
2011-01-11 20:44 901背景:项目中有许多可选参数,这时如果采取硬编码的方式将非 ... -
offLineMap2工作日记之getBoolean
2011-01-06 23:25 7921、如字段不是get**开头的boolean 如: boole ... -
开发常用小工具集
2011-01-06 22:26 2015毕业也有半年了,我有幸能加入一家知名IT公司并从事时下最 ... -
Eclipse中阅读开源项目代码
2010-12-25 22:57 2713[size=large] 背景:由于最近较为系统地学习了 ... -
Eclipse调试深入
2010-12-25 18:59 1316背景:我个人的调 ... -
Java打包总结
2010-12-19 22:35 1408背景:最近下载了一 ... -
Ant与批处理(win环境)学习笔记(2)
2010-12-19 22:01 1225在《Ant与批处理(win环境)学习笔记》中学习了Ant的一些 ... -
Ant与批处理(win环境)学习笔记
2010-12-19 10:27 1444背景:最近个人附 ... -
JDK工具学习
2010-12-18 22:14 1028[size=large] 起因:在 ... -
Eclipse插件安装总结
2010-12-18 12:29 1203大学时一直使用的 ... -
使用Ant和Maven构建时出现OOM异常
2010-12-14 23:14 1756今日更新测试环境时报OOM错误(工程中使用了Ant和Ma ... -
JAVA技术见识集
2010-12-12 09:34 870[size=large] 将网上看到的一些适用于指定场景的 ... -
Eclipse异常集
2010-12-08 19:52 22871、 Eclipse异常说An internal Error ... -
将批处理文件注册成服务
2010-11-15 19:49 3532前两天完成了将java程序注册成win服务,如今本人有一 ...
相关推荐
搭建Spring开发环境 Bean的常用配置 三种模式实现依赖(以service调用dao举例) 在serivce里面的类创建dao里面类的对象,调用方法 用工厂模式实现,service先通过工厂创建出来的dao,再调用其方法(面向接口编辑)...
3. **服务端java**:"CXF&spring初体验【服务端java】"可能会包含具体的Java代码示例,展示如何在Spring容器中定义服务接口和实现,以及如何利用CXF的注解来声明服务元数据。 客户端的实现则涉及到如何调用服务端的...
"头歌Spring Boot初体验"可能是一个文档,旨在引导初学者入门Spring Boot的世界。下面我们将深入探讨Spring Boot的核心特性和如何开始使用它。 1. **简介** Spring Boot是基于Spring框架构建的应用程序的快速启动...
《Spring for Android初体验》 在移动开发领域,Android开发者通常使用Java或Kotlin进行应用构建,但随着技术的发展,Spring框架也开始涉足Android世界。Spring for Android是Spring.io推出的一个库,旨在帮助...
这个"spring-security初体验demo"很可能是为了帮助初学者理解如何在实际项目中集成和配置Spring Security。下面,我们将深入探讨Spring Security的核心概念、工作原理以及如何通过实践来设置一个简单的示例。 ...
Spring Cloud是一个分布框架 Spring Cloud里边包括了目前最新的所有组件共21个
此文章是记录博主在学习springsecurity时的笔记 第一步 创建一个SpringBoot工程,勾选上需要的依赖。 第二步 创建一个名为securityconfig的配置类,该类基础了父类WebSecurityConfigurerAdapter(提供用于创建...
《手写Spring V1.0版本的初体验》 在IT行业中,深入理解框架的内部原理对于提升开发技能至关重要。Spring作为Java领域的主流框架,其设计理念和实现方式一直是开发者们热衷探讨的话题。本预习资料的目标是带领具有1...
Boot入门初体验是一门针对初学者准备的课程,讲解了如何一步一步进入Spring?Boot开发,课程采用循序渐进的方式,一个知识点一个知识点的讲解和学习,让初学者不知不觉的掌握各种开发技能,课程包含了主流框架搭建、...
数学建模 《Spring_Boot入门初体验》_视频教程_-_示例项目源代码。_SBTest.zip
通过"头歌springboot初体验.pdf"这份文档,你可能会学习如何创建一个基本的Spring Boot项目,了解Maven或Gradle的配置,编写第一个"Hello, World!"程序,理解自动配置的工作原理,并逐步接触Spring Boot的其他特性。...
SpringBoot+SpringSecurity+jwt整合详解 SpringBoot是当前最流行的Java框架之一,它提供了便捷的方式来构建基于Web的应用程序。然而,在构建Web应用程序时,安全性是不可忽视的重要方面。因此,本文将详细介绍如何...
《手写Spring V1.0版本:从300行代码理解核心机制》 Spring框架作为Java企业级应用开发中的重要支柱,其设计理念和实现方式一直是开发者深入学习的重点。通过手写Spring V1.0版本的代码,我们可以从实践中更好地...
Spring Cloud CLI 是Spring Cloud生态体系中的一个重要工具,它基于Spring Boot CLI扩展而来,为开发者提供了一种便捷的方式来管理和操作Spring Cloud的各种微服务组件。本文将深入探讨Spring Cloud CLI的使用和功能...
02.Spring Security 初体验 03.基于内存定义 Spring Security 用户 04.Spring Security 自定义表单登录 05.Spring Security 登录表单配置细节 06.Spring Security 表单登录源码 07.Spring Security 中的 JSON 交互 ...
在初体验部分,博主可能会介绍如何设置Acegi以保护一个简单的Spring应用,包括配置Spring XML文件、定义安全拦截器(filter)以及创建用户凭证。 身份验证过程通常涉及用户登录,Acegi支持多种认证方式,如基于表单...
总之,这个压缩包提供了使用Maven和IDEA 2023.3开发Spring Boot应用的初步体验,涵盖了从项目结构、依赖管理、数据库连接到实际业务代码编写和测试的各个环节。对于想要学习或已经在使用Spring Boot的开发者来说,这...
在"Spring MVC 实战学习系列(一)初体验"中,我们可能首先会接触如何搭建Spring MVC的基本环境。这通常涉及到以下几个步骤: 1. 引入依赖:在项目中添加Spring MVC的依赖,例如在Maven的pom.xml文件中引入spring-...
在本篇关于“Web基础——WebApp之初体验(三)”的文章中,我们将深入探讨Web应用程序(WebApp)的关键概念和技术,以及它们如何为用户提供便捷的在线体验。WebApp是互联网技术的重要组成部分,它们允许用户在浏览器...