《spring3.1(一)》由会员分享,可在线阅读,更多相关《spring3.1(一)(24页珍藏版)》请在金锄头文库上搜索。
1、1. Spring基础1.1. 开发应用时的一些问题1.1.1. 问题一:依赖在程序中要分层,且层与层之间要使用接口,就会有如下代码:public class UserServiceImpl private UserDao userDao = new MySQLUserDaoImpl();/ .以上代码是有问题的,即“在Service中引用的具体的实现类”,这样就和具体的实现类耦合在了一起,如果要更换(比如要换成OracleUserDaoImpl),就需要修改源代码。怎么样才能不依赖实现类呢?可以使用工厂模式,让UserDao的实现在在工厂中生成,而工厂是可以配置的,如下:/ 一、定义工厂类p
2、ublic class ObjectFactory / 用于存放“对象名-实现类的全名”这种对应关系的键值对集合private static Properties properties;static / 读取配置文件 ObjectFactory.properties,具体代码略。InputStream inputStream = ObjectFactory.class.getResourceAsStream(“*.properties”)properties.load(inStream);/ 可创建对象实例的工厂方法,接受的参数是对象名,如UserDao、RoleDao等public stat
3、ic Object createInstance(String name) / 首先根据名称获取对应的实现类的类名,要是全限定名才行(带包名的)String implClassName = properties.getProperty(name);/ 通过反射生成实例并返回(没有处理异常)return Class.forName(implClassName).newInstance();/ 二、使用工厂生成实例# UserDao = com.gemptc.dao.impl.MySQLUserDaoImpl# UserDao = com.gemptc.dao.impl.OracleUserDao
4、ImplUserDao = com.gemptc.dao.impl.MySQLUserDaoImpl/ 三、使用工厂生成实例public class UserServiceImpl private UserDao userDao = (UserDao) ObjectFactory.createInstance(UserDao);/ .以上代码就是通过工厂实现的与实现类的解耦,这种情况下如果想要更新别外一个实现类,只需要修改配置文件就可以了。如果对象有很多,且互相依赖,并且有的对象需要单例模式,有的则需要多个实例,这又怎么办呢?那就要再完善一下这个工厂类了,让工厂可以处理这些问题,这就是一个复杂
5、一点的工厂类了。1.2. 概念:控制反转(IOC,Inversion of Control)public class PersonServiceBean private PersonDao personDao = new PersonDaoBean(); public void save(Person person) personDao.save(person); PersonDaoBean 是在应用内部创建及维护的。所谓控制反转就是应用本身不负责依赖对象的创建及维护,而是由外部容器负责的。这样控制权就由应用转移到了外部容器,控制权的转移就是所谓反转。控制反转即IoC (Inversion o
6、f Control),它把传统上由程序代码直接操控的对象的调用权交给容器,通过容器来实现对象组件的装配和管理。所谓的“控制反转”概念就是对组件对象控制权的转移,从程序代码本身转移到了外部容器。IoC是一个很大的概念,可以用不同的方式来实现。例如:依赖查找(Dependency Lookup):容器提供回调接口和上下文环境给组件。EJB和Apache Avalon都使用这种方式。依赖注入(Dependency Injection):组件不做定位查询,只提供普通的Java方法让容器去决定依赖关系。后者是时下最流行的IoC类型。1.3. 概念:依赖注入(DI,Dependency Injection
7、)当我们把依赖对象交给外部容器负责创建,那么PersonServiceBean 类可以改成如下:public class PersonServiceBean private PersonDao personDao ; / 要有getter与setter/ 通过构造器参数,让容器把创建好的依赖对象注入进PersonServiceBean/ 当然也可以使用setter方法进行注入。 public PersonServiceBean(PersonDao personDao) this.personDao=personDao; public void save(Person person) perso
8、nDao.save(person); 所谓依赖注入就是指:在运行期,由外部容器动态地将依赖对象注入到组件中。1.4. 概念:面向切面编程(AOP,Aspect Oriented Programming)AOP为Aspect Oriented Programming的缩写,意为:面向切面编程(也叫面向方面),可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。主要的功能是:日志记录,性能统计,安全控制,事务处理,异常处理等等。使用JDK的动态代理可以实现AOP,如下图所示。1.5. Spring简介Spring是一个开源的控制反转(IoC)和面向切面(A
9、OP)的容器框架。它的主要目是简化应用的开发。Spring的IOC容器包含并管理应用对象的配置和生命周期,你可以配置你的每个bean如何被创建,也可以配置每个bean是只有一个实例,还是每次需要时都生成一个新的实例,以及它们是如何相互关联的。Spring提供了很多基础的与业务逻辑无关的功能,比如:事务管理、持久化框架集成等等。Spring的模块图如下所示:Spring以一种非侵入式的方式来管理你的代码,Spring提倡”最少侵入”,这也就意味着你可以适当的时候安装或卸载Spring。Spring框架的主页:http:/www.springsource.org/下载地址:http:/www.sp
10、ringsource.org/download2. 第1个Spring程序2.1. 准备开发环境2.1.1. 添加jar包dist目录中所有的jar包2.1.2. 准备配置文件配置文件的模版可以从spring的参考手册或spring的例子中得到。配置文件的取名可以任意,文件可以存放在任何目录下,但一般的的用法是放在类路径下,取名为applicationContext.xml。附配置文件applicationCotnext.xml:2.1.3. 编写spring配置文件时,不能出现帮助信息由于spring的schema文件位于网络上,如果机器不能连接到网络,那么在编写配置信息时候就无法出现提示信
11、息,解决方法有两种:方法一:让机器上网,eclipse会自动从网络上下载schema文件并缓存在硬盘上。方法二:手动添加schema文件,方法如下:1, windwos preferences myeclipse files and editors xml xmlcatalog。2, 点add,在出现的窗口中的Key Type中选择URI,在location中选File system,然后在projectes目录中找到org.springframework.beans工程,在resource/xml文件夹中选择spring-beans-3.1.xsd。3, 回到设置窗口的时候不要急着关闭窗口,
12、应把窗口中的Key Type改为Schema location,Key改为http:/www.springframework.org/schema/beans/spring-beans-3.1.xsd2.2. HelloWorld程序2.2.1. 创建类(Bean)1,Dao层:/ 一、Dao接口public interface UserDao void printInfo();/ 二、Dao实现类public class UserDaoImpl implements UserDao private String jdbcUrl;private String driverClass;priva
13、te String username;private String password;public void printInfo() System.out.println(jdbcUrl = + jdbcUrl);System.out.println(driverClass = + driverClass);System.out.println(username = + username);System.out.println(password = + password);/ getter与setter略2,Service层:public class UserServiceImpl private UserDao userDao;public UserDao getUserDao() System.out.println(UserServiceImpl.getUserDao();return userD