Spring初识
Spring概念
- Spring是开源的轻量级框架
- Spring是一站式框架
- 使用基本的JavaBean
spring的框架特征
- 轻量——从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布。并且Spring所需的处理开销也是微不足道的。此外,Spring是非侵入式的:典型地,Spring应用中的对象不依赖于Spring的特定类。
- 控制翻转(英文简写 =
ioc
)——Spring通过一种称作控制反转(IoC)的技术促进了低耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。你可以认为IoC与JNDI相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。 - 面向切面——Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如日志或事务支持。
- 容器——Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建——基于一个可配置原型(prototype),你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例——以及它们是如何相互关联的。然而,Spring不应该被混同于传统的重量级的EJB容器,它们经常是庞大与笨重的,难以使用。
- 框架——Spring可以将简单的组件配置、组合成为复杂的应用。在Spring中,应用对象被声明式地组合,典型地是在一个XML文件里。Spring也提供了很多基础功能(事务管理、持久化框架集成等等),将应用逻辑的开发留给了你。
- MVC——Spring的作用是整合,但不仅仅限于整合,Spring 框架可以被看做是一个企业解决方案级别的框架。客户端发送请求,服务器控制器(由DispatcherServlet实现的)完成请求的转发,控制器调用一个用于映射的类HandlerMapping,该类用于将请求映射到对应的处理器来处理请求。HandlerMapping 将请求映射到对应的处理器Controller(相当于Action)在Spring 当中如果写一些处理器组件,一般实现Controller 接口,在Controller 中就可以调用一些Service 或DAO 来进行数据操作 ModelAndView 用于存放从DAO 中取出的数据,还可以存放响应视图的一些数据。 如果想将处理结果返回给用户,那么在Spring 框架中还提供一个视图组件ViewResolver,该组件根据Controller 返回的标示,找到对应的视图,将响应response 返回给用户。
本段摘录 百度百科
Spring核心两部分
1. aop 面向切面
- 扩展功能,但不修改源代码
2. ioc 控制反转
- 之前的做法,创建对象 使用 new的形式
- 现在的做法,只需对Spring 进行xml的配置即可
Spring 一站式框架
- Spring在javaee三层结构的中,每层都提供了不同的解决技术
- web 层 —– SpringMVC
- service 层 —– Spring 的 ioc
- dao 层 —– spring 的 jdbcTemplate
Spring的入门
ico 的使用
- 把创建对象交给了Spring进行管理
- ioc 操作两部分:
- ico的配置文件方式
- ico的注解方式
ioc底层原理
- 文字描述
- xml配置文件
- dom4j 解决 xml
- 工厂设计模式
- 反射
图形描述
- 过程
原理
- 过程
ioc入门案例
- 导入jar包
- 每个jar包都有jar包\文档\源代码
- 核心jar包
- beans
- core
- context
- expression
- 日志jar包
- log4j
- commons-logging
- 创建一个类和方法
public class User{
public void add(){
System.out.println("add....")
}
}
- 创建Spring的配置文件,配置类
AppBean.xml
<!-- 1. 约束 -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<!-- 2.配置 -->
<bean id="user" class="com.bean.User"></bean>
- 写代码测试对象创建
//实际中不这么用 这只是个测试
public class Test{
public void main(String[] args){
//1. 加载spring的配置文件
Application context =
new ClassPathXmlApplictionContext("AppBean.xml")
//得到配置创建对象
User user = (User) context.getBean("user");
user.add();
}
}
Spring的bean管理
bean的三种实例化方式
1. 使用类的无参构造(重点)
配置方法
<!-- 使用类的无参构造创建对象 -->
<bean id="bean1" class="com.bean.User"></bean>
2. 使用静态工厂
- 创建静态方法
<!-- 配置 -->
<bean id="bean2" class="com.bean.User" factory-method="getUser"></bean>
3. 使用实例工厂
- 比较麻烦
- 创建非静态方法
<!--创建工厂-->
<bean id="bean1" class="com.bean.Factory"></bean>
<!--获得对象-->
<bean id="bean2" class="bean1" factory-method="getUser"></bean>
bean标签的常用属性
id
属性 : 名称可以任意命名,最好复合命名规则和规范class
属性 : 创建对象的全路径name
属性 : 和id
一样(基本不用了)scope
属性 : 作用范围singleton
: 默认值,单例prototype
: 多例request
: web项目中,Spring创建一个Bean对象,并放入request
域中.session
: web项目中,Spring创建一个Bean对象,并放入session
域中.globalSession
: web项目中,Spring创建一个Bean对象,应用在Porlet
环境,如果没有该环境,则放入session
中
属性的注入方式
- 创建对象的时候,向类里面属性里赋值.
- 有三种方式
- 构造方法
- set方法
- 接口方法
如图:
Spring注入属性
- 有两种方式
1. 构造方法
配置xml
<!-- 使用有参构造注入属性 -->
<bean id="abc" class="com.bean.User">
<!--
constructor : 构造器
arg : 参数
name="参数名称"
value="值"
-->
<constructor-arg name="uname" value="雷鸣"></constructor>
</bean>
2. set方法(常用)
配置xml
<!-- 使用set方法注入属性 -->
<bean id="abc" class="com.bean.User">
<!--
name="属性名称"
value="值"
-->
<property name="uname" value="雷鸣"></property>
</bean>
注意:必须有匹配的构造方法和set方法
Spring注入对象类型属性*
- 创建一个service类和dao类
- 在service中得到dao对
实现步骤
- 创建service类和dao类
- service中写dao类型的属性和set方法
- 配置文件 xml
<!-- 配置dao -->
<bean id="dao" class="co.bean.Sao"> </bean>
<!-- 配置service -->
<bean id="service" class="co.bean.Service">
<!--
注入dao对象
name : servic类型里面属性的名称
ref : 写入引用数据类型 dao <这是dao配置的 -id- 名称>
-->
<probperty name="daoname" ref="dao"></property>
</bean>
4.执行
用Spring在创建对象时,只需创建最外面的对象.
//加载配置文件
AplicationConttext context = new ClassPathAppliactionContext("bean.xml");
//得到配置文件的对象
Service service = (Service) context.getBean("service")
p名称空间注入
用 p: 的属性值 替代 -property-
<bean id="abc" class="com.bean.User" p:uname="luke"></bean>
Spring注入复杂数据
实体类
public class Person{
private String[ ] array;
private List< String > list;
private Map< String , String > map;
private Properties Properties;
/**...省去setter和getter方法...*/
}
xml配置
<!-- bean 省略 -->
<!-- 数组 -->
<property name="array">
<list>
<value>雷鸣1</value>
<value>雷鸣2</value>
<value>雷鸣3</value>
</list>
</property>
<!-- list -->
<property name="list">
<list>
<value>Class1</value>
<value>Class2</value>
<value>Class3</value>
</list>
</property>
<!-- map -->
<property name="array">
<map>
<entry key="key1" value="value1"></entry>
<entry key="key2" value="value2"></entry>
<entry key="key3" value="value3"></entry>
</map>
</property>
<!-- properties -->
<property name="array">
<props>
<prop key="drivareclass">cpm.mysql.jdbc.Driver</prop>
<prop key="username">root</prop>
</props>
</property>
ico和di区别
IOC : 控制反转
- 把对象交给Spring进行创建
DI : 依赖注入
- 向类里面注入属性值
关系:依赖注入不能单独存在 , 需要在IOC基础之上完成操作