spring -------------------------------
轻量级容器框架
ioc(最核心的东西),它把关系都封装好了;
aop 面向切面编程;代理技术;轻量级会服务;
ejb 也提供了这项服务,但是它是重量级服务;
比如:hibernate 中的session就交给spring来管了,spring就向一个大总管,什么郚它都管了。
spring 架构图:所有的服务都依赖于容器;
ssh 主要是对hiternate和struts的集成;
------------------spring---ioc 学习--------------------------------------
1。 建立相应的dao和manager(前台页面业务逻辑)
dao层接口、实现
mangage层(业务逻辑层)接口、实现
关于接口层与实现层我们可以人为写死的,但一个业务逻辑依赖好几个dao呢,我们就得把全部用得上的全部装配上,
由此我们引出 ioc (控制反转)。
IOC 控制反转:你别做这个信赖关系了,交给spring,由它去处理;可是使用这种服务是要有前提的:必需给相应dao接口
给相应的构造函数,也可以生成得到、set方法;这种形式这称为依赖注入,控制反转。
注入:是主动给的,假设:你要追尔一个女孩,你是主动,你依赖于它;你发起的,你就依赖于别人,反过来,她追你;主动给的你,我们并没有信赖于它
它没有琴入性,你离开了,他不受什么影响。
-------ioc-----spring----相关配置----------------------------------
spring相关配置相关jar spring最核心的jar 是相关dist文件夹的下的 spring。jar
和两个日志包:common:log4j.jar logg-common。jar
在sspring解压过文件中复制applicationContext.xml/和log4j.jar
配置dao:
*************《关于构造函数的注入在applicationContext中的<bean>
<contr
</bean>
客户端加载: BeanFactory factory=newClassPathApplication("相关spring配置");
factory。getBean("取出你要的产品"); spring在给你的时候它把所有实例都给我们创建好了。
使用spring它为我们做了很多事,使我们更专注业务。
用set方法注入和构造函数注入之区别:使用构造函数它被调用的时机比较早,一在类加载的时候就把dao加载进来一,而set是在实例化之后,才来注入的.
它们区别就在时机上面已,具体情况而定
spring ioc应用的是di依赖注入,依来注入是别人创建好了来给你。 但并不是说所有的实例都由它来创建军。
使用spring ioc 会使我们的程序比较清晰。spring没有侵入性,这是一个轻量级框架
为什么都使用轻量级的,因为它不信依赖于容器。
-------------属性注入------------------------
只要我们给这个类提供构造函数和set方法,我们就可以把它注入进去。
日志目录,如果没有明确给出,就会在你相应的工程下,建立一个web-inf的文件,里面就是程序运行时的日志文件。
属性注入方法:在applicationContext。xml中
《bean id="合法的名称" class=“该属性名所在的类(action)”>
因为是set注入
《property name===“在类中和action中的属性名称set后面的属性名称” value="123"/》//这样的话就注入进去了。
别一种方式;(int 型)<property name="在类中和action中的属性名称set后面的属性名称">
<value>123</value>
</property>
</bean>
map在bean中注入用的是《map 》
<entriy key="k1" value="v1">
<entriy key="k2" value="v2">
《/map>
如工程比较大,都气配置文件放在一个文件中,会有点太乱,spring是可以分文件来管理的(也就是分文件)。
对于多文件的我们可以给所有spring一个约定:然后用通配匹配:如所的spring文件都 是applicationContext头的,我们可以这样来事实定义
applicationContext_*;
例如:applicationContext_beans。xml
applicationCOntext_beans1.xml
--------------------------日期注入----------如果按照上面的形式来注入,那么注入就会有问题的,在struts中它提供了conterter,在spring中提供了自定义属性编辑器
作用spring属性编缉器,在类继乘的时候,要继成javabean下面的东西.然后把相应属性转换注入进来 ----方法:
属性编辑器,把相应的字符串转换成相应的对象注入。spring有内制的属性编辑器,我们右以自己定义,继成一个类,propertyeditsupport然后复写AsText参见
spring类型转换原理:把相应的类型交给弹跳去管理。关于日期的有点特别:需要运用人为调用一下弹跳的属性编辑器方法格式化一下该日期。
spring 关于日期转换:事例:
定义一个属性转换器:com.test.property.UtildateProperty.java
public class UtildateProperty extends PropertyEditorSupport {
private String format="yyyy-MM-dd";
public void setAsText(String text) throws IllegalArgumentException {
System.out.println("UtildateProperty 属性编辑器text="+text);
SimpleDateFormat sdf=new SimpleDateFormat(format);
try {
Date d=sdf.parse(text);
this.setValue(d);
} catch (ParseException e) {
e.printStackTrace();
}
}
public void setFormat(String format) {
this.format = format;
}
}
在applicationContext-beans.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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<bean id="bean1" class="com.test.property.Bean1">
<property name="mapValue">
<map>
<entry key="k1" value="map1"/>
<entry key="k2" value="map2"/>
</map>
</property>
<property name="strValue" value="string"/>
<property name="dateValue">
<value>2008/09/09</value>
</property>
</bean>
</beans>
针对日期转换相关xml文件applicationContext-utilDate.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:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<!-- 需要把它注入到一个spring的类里 定义一个属性编辑器-->
<bean id="customEditorConfigurer"
class="org.springframework.beans.factory.config.CustomEditorConfigurer">
<property name="customEditors">//这个属性来自CustomEditorConfigurer类中的一个map属性
<map>
<entry key="java.util.Date">
<bean class="com.test.property.UtildateProperty">
<property name="format" value="yyyy/MM/dd"></property>
</bean>//为了适应各类时间格式,我们利用注入的方式把日期格式注入一下,然后在bean中指定一下就可以用了。这就是spring IOC 的强大之处。
</entry>
</map>
</property>
</bean>
</beans>
-----------------------------------------spring公共策略---------------------------
把几个类中的相同属性拿出来,定义成一个抽象的《bean》如:
<bean id="Abstract" abstract="true">
把相同属性配制在这里如:
写的方法和来的属性方法一致《用property》
</bean>
当相你关类加载属性时可以这样来做:
《bean id="bean2" class="com.test.beans.bean2" parent="Abstract"》
然后在里面加上它的扩展属性,就是在本类中有的,在人为定义的抽象类中没有有
《/bean>
**依赖注入有好几种方式:
ref属性
《ref》标签
内部bean
----------------------------spring bean的作用域(scope)-----------------------------
作用域就是,当我们每次getBean的时候,spring每次给我们创建一个实例呢,还是怎么的呢?
请看下面的例了:
比如:Bean1 bean1=new ClassPathApplicationContext("applicationContext.xml");
Bean1 bean2=new ClassPathApplicationContect("applicationContext.xml");
if (bean1==bean2)
{
System.out.println("bean1==bean2");
}
else{
System.out.println("bean1!=bean2");
}
所以对spring对bean的初始化只有一次,初始化一次,就不在初始化了。
每个bean都有有它的相关属性: <bean id="bean1" class="com.test.property.Bean1" scope=”“>
如果不写,它的默认值是singleton,作用域就是spring对bean只初始化一次,每次调用的时候返回相同的实例。另一属性:prototype;它的意思就是每次getBean的时候它就会给我们重新创建军一次。
每次调用的时候返回不同的实例。
-----------------------spring自动装配=-----------------------------
它的主要作用就是:简化代码编写,有利于提高开发效率
根据名称的自动装配:主要是开发效率:写法:在applicationContext。xml:尖括号内加一个属性:default-autowier=”byName“它指对本文件生效
前提,约定要一定。
根据类型装配:如果按类型装配,那和无论相应id的值怎么变都不会影响class的加载
--------------------------ioc这一块结束-------------------------------------------
ioc就向一个大型的抽象的工厂,但它比抽象工厂更复杂。它有关系注入。