Spring基础入门一、基础知识1.依赖注入、控制反转依赖注入:在运行期,由外部容器动态地将依赖对象注入到组件中控制反转:应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部窗口负责得。
这样控制权就由应用转移到了外部容器,控制权的转移就是所谓的反转。
2.spring 的主要特性。
(1)降低组件之间的耦合度,实现软件各层之间的解耦。
(2)可以使用容器提供的众多服务,如:事务管理服务、消息服务、JMS 服务、持久化服务等等。
(3)容器提供单例模式支持,开发人员不再需要自己编写实现代码。
(4)容器提供了AOP 技术,利用它很容易实现如权限拦截,运行期监控等功能。
(5)容器提供的众多辅作类,使用这些类能够加快应用的开发,如:JdbcTemplate、HibernateTemplate.(6)对主流的应用框架提供了集成支持。
3.常用技术控制反转/依赖注入---面向切入编程---与主流框架的整合、管理---二、实例拓展1.准备搭建环境dist\spring.jarlib\jakata-commons\commons-loggin.jar如果使用了切面编程,还需下列jar 文件:lib\aspectj\aspectjweaver.jar 和aspectjrt.jarlib\cglib\cglib-nodep-2.1.3.jar如果使用了jsr-250 中的注解,还需要下列jar 文件:lib\j2ee\common-annotations.jar2.搭建并测试环境建立名为spring_01_base项目,根据需求导入jar包。
建立一个Junit测试单元SpringEnvTest,测试代码如下:@Testpublic void testEnv() {ApplicationContext ctx = newClassPathXmlApplicationContext("beans.xml");}beans.xml 配置文件在此省略(见下)。
运行此测试如无错,则说明环境搭建成功。
说明:beans.xml 可以在类路径下进行配置,也可以在具体的目录下配置。
可以是一个配置文件,也可以是多个配置文件组成String 数组传入。
3.实例作如下准备工作:(1)建立UseDao接口,代码如下:package com.asm.dao;public interface UserDao {void save();}(2)建立UserDao接口的实现类,UserDaoImplpackage com.asm.dao.impl;import erDao;public class UserDaoImpl implements UserDao{public void save() {System.out.println("执行save方法...");}}(3)在src目录下配置此beans.xml,它的配置如下:<?xml version="1.0" encoding="UTF-8"?><beans xmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans-2.5.xsd"><bean id="userDaoImpl" class="erDaoImpl" /></beans>说明:bean 代表一个实质的java 类,通过它的id 可以获取一个此类的一个对象。
补充:让xml 配置文件在编译时提示[windows][preferences][myeclipse][files and editors][xml][xml catalog] 点add,在出现窗口的location 中选“file system”,然后在spring 解压目录的dist/resources 目录中选择“spring-beans-2.5.xsd”,并将key Type 值改为“Schema Location”,key 值为:/schema/beans/spring-beans-2.5.xsd(4)Junit 测试单元SpringEnvTest 中增加如下代码测试:@Testpublic void base() {ApplicationContext ctx = newClassPathXmlApplicationContext("beans.xml");UserDao userDao = (UserDao) ctx.getBean("userDaoImpl");userDao.save();}以上的代码就是通过配置文件beans.xml 获取所需要的实例对象。
4.三种bean 的生成方式除了上面使用的类直接生成方式,还有bean 静态工厂及bean 实例工厂。
bean 静态工厂的配置如下:<bean id="userDaoImpl2" class="erDaoImplFactory" factory-method="getUserDaoImpl"/>相应的工厂类代码如下:package com.asm.dao.impl;public class UserDaoImplFactory {public static UserDaoImpl getUserDaoImpl(){return new UserDaoImpl();}}bean实例工厂的配置如下:<bean id="factory" class="erDaoImplFactory2"/><bean id="userDaoImpl3" factory-bean="factory"factory-method="getUserDaoImpl"/>相应的工厂类的代码如下:package com.asm.dao.impl;public class UserDaoImplFactory2 {public UserDaoImpl getUserDaoImpl() {return new UserDaoImpl();}}5.bean 的作用域singleton:返回bean 的同一个实例,也是默认的作用域(无状态bean 使用此作用域)prototype:每次请求都会创建一个实例(有状态bean 使用此作用域)request、session、global session 这三个作用域主要用在web 应用中6.bean 的生命周期(1)什么时候初始化bean 实例当scope=singleton,即默认情况,会在装载配置文件时实例化。
如果希望在调用getBean 时才初始化,可以使用lazy-init="true" 补充:如果希望希望该配置文件中的所有bean 都延迟初始化,则应在beans 根结点中使用lazy-init="true"。
当scope=prototype 时,在调用getBean()方法时才会初始化。
(2)生命周期:构造器、init 方法、获取bean 后的操作、destroy 方法(ctx.close、注意如果bean 的scope 设为prototype 时,当ctx.close 时,destroy 方法不会被调用)7.属性注入Setter 方式(1)简单属性(如String):<bean id="userServiceBean" class="erServiceBean"><property name="id" value="10"></property><property name="username" value="张某某"></property></bean>(2)对象属性-外部bean 注入:在上面的<bean>中增加如下配置:<property name="userDao" ref="userDaoImpl"/>对象属性-内部bean注入:在上面的<bean>中增加如下配置:<property name="userDao"><bean id="temp" class="erDaoImpl"/></property>(3)集合属性注入:<property name="list"><list><value>List值一</value><value>List值二</value><value>List值三</value></list></property><property name="set"><set><value>Set值二</value><value>Set值一</value><value>Set值三</value></set></property><property name="map"><map><entry key="one" value="一" /><entry key="two" value="二" /><entry key="three" value="三" /></map></property><property name="pro"><props><prop key="p1">first</prop><prop key="p2">second</prop><prop key="p3">third</prop></props></property>注意:在相应的字段上一定要有setter 方法,才能注入。