Spring 配置基本的 bean

学习笔记。

Spring 配置Bean 有挺多种方式,灵活多样化,不过初学,我还是从最基本的开始抓起。

关于依赖注入(Ioc/DI)不做过多总结,网上的比我好太多了,笔记就看例子:

1、设置注入

    设置注入,也成为属性注入,是指通过 seter()方法传入被调用者的实例。这种注入方式,简单直观,因为在Spring依赖注入里最常用。具体看代码实例。

2、构造注入

    所谓的构造注入,指通过构造方法来完成依赖关系的设定,而不是通过seter()方法。具体看代码实例 ,重点在xml文件的配置:

普通 bean 的方式:

package net.mzzo.spring.test;

public class BeanClass {
	public void doSomething() {
		System.out.println("----- BeanClass doSomething() ----");
	}
}

通过构造函数构造的 bean :

package net.mzzo.spring.test;

public class ConstructorClass {
	public ConstructorClass(String name) {
		System.out.println("----ConstructorClass: " + name + " ---");
	}
}

通过设置方式构造的 bean :

package net.mzzo.spring.test;

public class SeterClass {

	private int age;
	private String name;
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	@Override
	public String toString() {
		return "name:" + name + " , age:" + age;
	}

	public SeterClass() {
	}

}

继续阅读 »

Java Servlet 内存溢出 OutOfMemoryError 解决

小经验。

这次用Tomcat 启动时内存溢出,代码反复查看调试,就是查不出来哪里溢出,突然发现启动Tomcat时很慢,就怀疑Tomcat中的项目太多,启动时占用内存,就试着将Tomcat中Webapps 中测试或不用的项目移除,在重启Tomcat ,运行,通过。

 

Java 设计模式之动态代理

动态代理技术是实现AOP切面编程思想的一个关键技术,在此例子中,用到了动态编译,反射等技术。

使用例子讲解:Java 动态代理源码

Java 设计模式之静态代理

静态代理,是代理模式中的一种,是比较常用和简单的一种代理模式。

所谓代理,就是将核心功能交给另一个对象完全支配,这个对象可以在这个核心功能的执行前或执行后插入一些代码,可以这样:

public void method() {
    //  执行前:记录日志()
    //  执行中:核心功能()
    //  执行后:输出 核心功能() 执行后的时间
}

这是一种实用的设计模式,用UML图表示

上图摘自:大话设计模式

Subject 是一个接口,而RealSubject 和 Proxy 分别实现了此接口。而RealSubject是真正的功能,Proxy是一个代理类,其私有属性:realRealSubject  是一个RealSubject 类型的对象。Proxy 拥有代理 RealSubject的权限,又拥有和ReslSubject完全相同的接口方法。而若在这些相同的方法中,调用其私有属性:realSubject 的方法,则就是实现代理功能,如类:

public interface Subject {
    public void hello();
}
public class RealSubject implemetns Subject  {
    @Override
    public void hello() {
        System.out.println("我是ReslSubject?");
    }
}

public class Proxy implements Subject {
    private ReslSubject realSubject ;
    public Proxy (ReslSubject realSubject) {
        this.realSubject = realSubject;
    }
   @Override
    public void hello() {
         System.out.println("记录日志:他说了:");
         realSubject.hello();
         System.out.println("以上这些话");
    }
}

在Client 中,实例化一个 ReslSubject 和Proxy,将ReslSubject 交给Proxy,就可以实现了,如:

public class Client {
    public static void main (String[] args) {
         RealSubject r = new RealSubject();
         Proxy proxy = new Proxy(r);
         proxy.hello();
    }
}

就实现了代理功能,这静态代理。

静态代理虽然好用,但缺点也很明显,上面的代理功能实现记录日志,但若过段时间我想在访问他之前先判断有没权限,就是搞个权限控制,好,你说可以在实现一个代理类,然后我在要求多加一个功能,就要再实现一个代理类。这还是一个类的代理类,如果我要实现多个类,也就是多个接口的代理类,每个类都要一个记录日志,权限控制,N个需要代理的类,就需要写 N + N + N ……个代理类。

问题自然就暴露出来了,要解决这个问题,就需要用到动态代理,动态代理的功能原理和静态代理差不多,但代理类却是可以动态生成,可以在执行时,动态编译类,反射等技术。

动态代理:Java 设计模式之动态代理

静态代理模式例子(Java):http://www.linjie.org/wp-content/uploads/2012/04/StaticProxy.rar

 

MyEclipse导入Java项目时出错的几个解决思路

Eclipse导入Java工程,有时会莫名其妙的出错,
而且是那种你费半天劲还查不出来到底是哪里出的 Bug的错。

以下的凭经验遇到的几种Bug的解决思路,方法不一,有更好的希望写出共勉。

1、文件编码  
   Eclipse创建的文件有自己的编码格式。当你的工程被导入进来时,有些文件,比如:xml或一些资源文件,
   会出现一些错误,冒一个大大的红叉,你查来查去,他的错误会定位在本来没有错的一行,你怎么改?
   一般来说,我自己的打开Notepad++或其他文本查看工具,然后一个个改它的文件编码格式(我一般改成UTF-8),
   当然,如果有更好的工具当然是更好。

继续阅读 »

Java类内部初始化顺序

Java类的初始化顺序为:
1、初始化静态变量
2、执行静态模块
3、初始化变量
4、执行初始化块
5、执行构造方法
如果有父类,则先执行父类的 1、2,接着执行子类的1、2 接着再执行父类的:3、4、5 ,然后子类的:3、4、5如下代码:

父类:

package net.mzzo.initorder;

public class Super {

	//父类静态变量
	public static String staticString = "Super staticString 静态变量";

	//父类普通变量
	public String string = "Super string 变量";;

	// 初始化块
	{
		System.out.println(string);
		System.out.println("Super 初始化块");
	}

	// 静态初始化块
	static {
		System.out.println(staticString);
		System.out.println("Super 静态初始化块");
	}

	public Super() {
		System.out.println("Super 构造方法()");
	}
}

继续阅读 »

Java多线程之生产者和消费者

多线程同步问题是多线程编程需要考虑和明白的问题,对于如果两个或两个以上线程需要访问同一个对象资源,问题就随之而来,谁先谁后,如果当前线程正在修改此对象,那么其他线程呢,如果多个线程同时修改一个对象,最后谁真正的修改了?谁又被覆盖了?所以如果不弄清楚同步这个问题,多线程就很危险。

生产者和消费者就是典型的多线程同步问题,搞明白了这个,也差不多就明白了多线程同步的问题,如下代码:

继续阅读 »

领域模型,业务模型

感想,计算机模拟现实世界,用二进制作为最基础的奠基石。

领域模型,业务模型,用计算机,用面向对象去模拟一个现实世界的一种领域。

继续阅读 »

Java JDK的感想

笔记整理,记录于:2011-6-22

笔误之处请谅解。

这里拿我熟悉的Java 语言 来说,其他语言类似。

常常听一些IT大牛说,JDK x.x 版(JAVA语言)支持什么什么,在以前都是不支持的,这是新技术,

那时我常常疑惑,为什么JDK升级后,JAVA语言就也升级了呢,语言为什么会升级?语言升级是个什么概念,现在才缓过来,后知后觉。

Java 语言是一种编程语言,C# 也是一种编程语言,C、C++ 等等,也都是一种语言,他们其实就是是遵守某些规则或是去描述这些规则所产生的功能而已,

而他们所遵守所描述的的规则,是由谁来定义的?

继续阅读 »

Java 一些有用的知识点

一些Java小知识点,也许有时候你写了大堆的判断还不如自带的函数,如:startsWith() ,endsWith() ,呵呵。当作随记吧。

public class Main {

	public static void main(String[] args) {
		//匹配
		String url = "http://www.linjie.org";
		//全部转为大写
		url = url.toUpperCase();
		//判断是否Http开头
		if (url.startsWith("HTTP://")) {
			System.out.println("OK");
		} else {
			System.out.println("failure");
		}
		//判断结尾,这种判断可以用来辨别文件后缀名
		if (url.endsWith(".ORG")) {
			System.out.println("OK");
		} else {
			System.out.println("failure");
		}

		/* 1/0=? ,是的,算术错误 ,那么 :1/0.0=? 这个呢? */
		System.out.println(1/0.0);
		//结果:Infinity ,无穷大
		//类似:
		System.out.println(-1/0.0);
		//结果:-Infinity ,负无穷大

		//还有:0.0/0.0 = ?
		System.out.println(0.0/0.0);
		//结果:NaN ,非数字
	}

}