Spring入门(1)
一、Spring名词
侵入式设计(struts)
引入了框架则对现有的类的结构产生影响,例如Action类需要实现ActionSupport类。
非侵入式设计
与上相反。
1、IOC(inversion on control) 控制反转
2、依赖注入
处理对象的依赖关系。
3、AOP 面向切面编程
切面简单的理解就是一个类,由许多重复的代码形成的类。
举例:事物、日志、权限
二、Spring框架
2.1概述
Spring框架:可以解决对象的创建以及对象之间依赖关系的一种框架。并且还可以和其他框架一起使用。Spring与Struts,Spring与hibernate;所以说Spring起到了框架整合的作用。
2.2六大模块
Spring提供了一站式解决方案。
1)Spring Core spring的核心功能:IOC容器,解决对象创界以及对象之间的依赖关系。
2)Spring Web spring 对web模块的支持。
→可以和Struts整合,让Struts的Action创建交给spring
→springmvc模式
3)Spring DAO 对jdbc操作的支持
4)Spring ORM 对orm的支持表现在:
→可以与Hibernate整合
→也可以使用Spring对Hibernate操作的封装
5)Spring AOP 切面编程(难点)
6)SpringEE Spring对javaEE其他模块的支持。
2.3开发步骤
1)下载源码
2)引入jar包
3)查看API,编写代码
2.4 bean创建细节
1、对象创建:单例/多例
Scope = “singleton”,单例,默认值
Scope =”prototype”多例的
2、什么时候创建?
Scope =”prototype”用到的时候才创建
Scope = “singleton”启动的时候创建
3、是否延迟创建
Lazy-init=”false” 默认值为false,即不延迟创建,在启动的时候创建
Lazy-init=”true” 延迟初始化,在用到的时候才初始化。
三 SpringIOC容器
3.1 创建对象
IOC容器创建对象:
创建对象的几种方式:
(1)调用无参数构造器
(2)调用有参数构造器
(3)工厂创建对象
工厂类,静态方法创建对象(类名.方法())
工厂类,非静态方法创建对象(实例化对象.方法)
bean.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- ###############对象创建############### --> <!-- 1. 默认无参数构造器 <bean id="user1" class="cn.itcast.b_create_obj.User"></bean> --> <!-- 2. 带参数构造器 --> <bean id="user2" class="cn.itcast.b_create_obj.User"> <constructor-arg index="0" type="int" value="100"></constructor-arg> <constructor-arg index="1" type="java.lang.String" value="Jack"></constructor-arg> </bean> <!-- 定义一个字符串,值是"Jack" ; String s = new String("jack")--> <bean id="str" class="java.lang.String"> <constructor-arg value="Jacks"></constructor-arg> </bean> <bean id="user3" class="cn.itcast.b_create_obj.User"> <constructor-arg index="0" type="int" value="100"></constructor-arg> <constructor-arg index="1" type="java.lang.String" ref="str"></constructor-arg> </bean> <!-- 3. 工厂类创建对象 --> <!-- # 3.1 工厂类,实例方法 --> <!-- 先创建工厂 --> <bean id="factory" class="cn.itcast.b_create_obj.ObjectFactory"></bean> <!-- 在创建user对象,用factory方的实例方法 --> <bean id="user4" factory-bean="factory" factory-method="getInstance"></bean> <!-- # 3.2 工厂类: 静态方法 --> <!-- class 指定的就是工厂类型 factory-method 一定是工厂里面的“静态方法” --> <bean id="user" class="cn.itcast.b_create_obj.ObjectFactory" factory-method="getStaticInstance"></bean> </beans>
3.2 对象的依赖关系
Spring中如何给对象的属性赋值呢?
1) 通过构造函数
2) 通过set方法给属性注入值
3) p名称空间
4)自动装配(了解)
5) 注解
1、常用:set方法注入值
<!-- dao instance --> <bean id="userDao" class="cn.itcast.c_property.UserDao"></bean> <!-- service instance --> <bean id="userService" class="cn.itcast.c_property.UserService"> <property name="userDao" ref="userDao"></property> </bean> <!-- action instance --> <bean id="userAction" class="cn.itcast.c_property.UserAction"> <property name="userService" ref="userService"></property> </bean>
2、内部bean
<!-- ##############内部bean############## --> <bean id="userAction" class="cn.itcast.c_property.UserAction"> <property name="userService"> <bean class="cn.itcast.c_property.UserService"> <property name="userDao"> <bean class="cn.itcast.c_property.UserDao"></bean> </property> </bean> </property> </bean>
3、p名称空间注入属性值
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- ###############对象属性赋值############### --> <!-- 给对象属性注入值: # p 名称空间给对象的属性注入值 (spring3.0以上版本才支持) --> <bean id="userDao" class="cn.itcast.c_property.UserDao"></bean> <bean id="userService" class="cn.itcast.c_property.UserService" p:userDao-ref="userDao"></bean> <bean id="userAction" class="cn.itcast.c_property.UserAction" p:userService-ref="userService"></bean> <!-- 传统的注入: <bean id="user" class="cn.itcast.c_property.User" > <property name="name" value="xxx"></property> </bean> --> <!-- p名称空间优化后 --> <bean id="user" class="cn.itcast.c_property.User" p:name="Jack0001"></bean> </beans>
4、自动装配:Spring提供的自动装配主要是为了简化配置; 但是不利于后期的维护。不推荐使用
根据名称自动装配:autowire="byName"
<!-- ###############自动装配############### --> <bean id="userDao" class="cn.itcast.d_auto.UserDao"></bean> <bean id="userService" class="cn.itcast.d_auto.UserService" autowire="byName"></bean> <!-- 根据“名称”自动装配: userAction注入的属性,会去ioc容器中自动查找与属性同名的对象 --> <bean id="userAction" class="cn.itcast.d_auto.UserAction" autowire="byName"></bean>
根据类型自动装配:autowire="byType"
必须确保IOC容器中同类型的对象只有一个。否则报错,因为电脑此时不知道调用哪一个。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd" default-autowire="byType"><!--定义到全局不用每个节点都写了--> <!-- ###############自动装配############### --> <bean id="userDao" class="cn.itcast.d_auto.UserDao"></bean> <bean id="userService" class="cn.itcast.d_auto.UserService"></bean> <!-- 如果根据类型自动装配: 必须确保IOC容器中只有一个该类型的对象 --> <bean id="userAction" class="cn.itcast.d_auto.UserAction"></bean> <!-- 报错: 因为上面已经有一个该类型的对象,且使用了根据类型自动装配 <bean id="userService_test" class="cn.itcast.d_auto.UserService" autowire="byType"></bean> --> </beans>
5、注解:方式可以简化spring的IOC容器的配置!
使用注解步骤:
1)先引入context名称空间
xmlns:context="http://www.springframework.org/schema/context"
2)开启注解扫描
<context:component-scan base-package="cn.itcast.e_anno2"></context:component-scan>
3)使用注解
通过注解的方式,把对象加入ioc容器。
创建对象以及处理对象依赖关系,相关的注解:
@Component 指定把一个对象加入IOC容器
@Repository 作用同@Component; 在持久层使用
@Service 作用同@Component; 在业务逻辑层使用
@Controller 作用同@Component; 在控制层使用
@Resource 属性注入
总结:
1) 使用注解,可以简化配置,且可以把对象加入IOC容器,及处理依赖关系(DI)
2) 注解可以和XML配置一起使用。
四 Spring与struts的整合
【SSH整合:
Spring与Struts
关键点: 让struts框架的action对象的创建交给spring!
Spring与Hibernate
关键点: sessionFactory对象的创建交给spring!
】
步骤:
1、引入jar包
1)引入struts .jar相关文件
2)spring-core 相关jar文件
3)spring-web 支持jar包
spring-web-3.2.5.RELEASE.jar 【Spring源码】
struts2-spring-plugin-2.3.4.1.jar 【Struts源码】
2、配置XML
struts.xml 【struts路径与action映射配置】
bean.xml 【spring ioc容器配置】
web.xml
【核心过滤器: 引入struts功能】
【初始化spring的ioc容器】
3、 代码以及配置