spring_day01
spring:一站式架构,对象容器,其中对象的功能都可被看做spring的功能
EE开发分三层结构:
* WEB层:springMVC
* 业务层:Bean管理(IOC)
* 持久层:例如spring的JDBC模板、ORM模板用于整合其他的持久层框架
spring环境搭建:
(1)导入核心包:beans、context、core、expression和第三方日志包log4j、logging
(2)创建Bean对象用于后面测试
(3)创建xml文件,建议使用applicationContext.xml并置于src下,其实位置和命名可以任意指定,但是一般将其放置于src即类路径(classpath)下
(4)导入约束,一般可使用联网约束,这里使用本地导入下载好的约束(1)(Window->Preferences->输入cata->选中xml catalog->点击Add->点击File System->选择约束->在Key type中选择Schema location->将location中的spring-beans-4.2.xsd补到key末尾->OK)(2)将xml文件以xml Editor方式打开,调到design视图,右键->Edit NameSpace->Add->xsi(默认)和specify NewNamespace中的springframework(刚刚添加的约束)注意,在项目中此时的前缀设置为空,但是只能有一个前缀为空,其他Prefix一般设置为NameSpace Name前缀
(5)简单测试:Demo测试类,通过加载ApplicationContext.xml获得Bean对象,是因为在ApplicationContext.xml中构造了bean对象,所以Demo可以使用该对象
trick:Crtl+1->报红导包
spring名词解释:
IOC:控制反转,将对象的创建方式反转(以前new 类名()),使用了spring之后,对象的创建以及依赖关系由spring创建注入,将以前由人new创建交给了spring容器创建
DI:依赖注入,实现IOC的思想需要DI做支持
注入方式:set方法注入(一定要有set、get方法)、构造方法注入、p名称注入、spel注入
注入类型:值类型、引用类型
BeanFactory(接口):
spring最原始接口,针对原始接口实现类较为单一(每次获得对象时才会创建对象,例如getBean(字符串名称)才会加载)
ApplicationContext(接口):
new ClassPathXmlApplicationContext(“applicationContext.xml”)类路径下的xml文件,在加载这个xml文件时会创建该xml配置中的所有bean对象(不具体调用也会创建,后面会提到这是因为bean元素默认singleton),这可以通过在构造方法中加输出来测试
补充:硬盘绝对路径FileSystemXmlApplicationContext
Web开发中资源匮乏时可用Beanfactory 毕竟惰性加载lazy-loading
bean元素相关配置:
name:被管理对象别名 class:具体类的全路径 id:与name一模一样,名称不能重复,不能使用类似于/的特殊字符
三种对象的创建方式:
(1)例子<bean name="user" class="cn.itcast.bean.User"></bean>
空参或者后面可以各种注入属性等构造
(2)静态工厂:通过工厂创建,static 工厂方法
(3)实例工厂:非静态工厂方法,就是比上面需要多一个bean用于创建工厂对象然后调用工厂方法,原class改为factory-bean具体见代码
bean元素的scope属性(是bean属性不是property属性):
singleton:默认值,单例对象,被标识为单例的对象在spring中只会存在一个实例,默认值
prototype:被标识为多例的对象每次获得时才会创建(ac.getBean(“user”)),在容器启动时不会创建,每次都会创建不同的对象,可用equals或者对象地址测试,spring容器创建完对象交出就不管了,即(对象非接口了)ac.close()不会调用@PreDestroy方法了。
request:web环境下,对象与request生命周期一致
sesssion:web环境下,对象与session生命周期一致
大部分情况下取singleton,与struts整合(action对象这时交由spring管理),不同客户端访问有不同的action,这时spring返回一个action有问题,此时ActionBean必须为多例
bean元素的生命周期:可以配置一个方法作为生命周期的初始化方法,spring会在该对象创建之后立即调用(init-method)
配置一个方法作为生命周期的结束方法,在spring容器关闭并销毁所有容器对象之前调用 <bean name="user" class="cn.itcast.bean.User" init-method="init" destroy-method="destroy"></bean>
注意init与destroy方法在User类中,但是如果
<bean name="user" class="cn.itcast.bean.User" init-method="init" destroy-method="destroy" scope="prototype"></bean>
加入了scope这个属性值prototype就会只有init方法没有destroy方法了
spring分模块配置,可以在一个主配置文件中引入其他spring配置文件,例如<import resource="cn/itcast/b-create/xxx.xml">
spring属性注入:
1.set方法注入
2.构造函数注入
3.p名称空间注入
4.spel注入
A.set注入(值类型用value,引用类型用ref)(这里使用eclipse发现并不区分属性值首字母大小写)(一定要有set、get方法啊)
例:(这里加载配置文件时测试构造函数输出与排序有关)
<!-- set方式注入 -->
<bean name="car" class="cn.itcast.bean.Car">
<property name="name" value="奥迪"></property>
<property name="color" value="red"></property>
</bean>
<bean name="user" class="cn.itcast.bean.User">
<property name="name" value="tom"></property>
<property name="age" value="18"></property>
<property name="car" ref="car"></property>
</bean>```
B.构造函数定义(一定要有相关构造器啊)(其中构造器注入的属性名一定要和构造方法属性名一致)
<!-- 构造方式注入 -->
<bean name="user2" class="cn.itcast.bean.User">
<constructor-arg name="Name" value="newname"></constructor-arg>
<constructor-arg name="car" ref="car2"></constructor-arg>
</bean>
<bean name="car2" class="cn.itcast.bean.Car">
<constructor-arg name="name" value="宝马"></constructor-arg>
<constructor-arg name="color" value="褐色"></constructor-arg>
</bean>
(其中构造和set注入可交叉使用,例如B中car2可使用1中的car,A中的car可使用B中的car2,最后改下user中的ref即可)
补充:(在constructor-arg中使用index=”0”或index=”1”等指定参数顺序,当然先以参数名为基准,此时构造器都是name和color不知道选哪个,为了解决以下问题)
public User(String Name,Integer age){
System.out.println("空参构造");
}
public User(Integer age,String Name){
System.out.println("空参构造");
}
(constructor-arg中使用type来指定类型,例如type=”java.lang.integer” name=”999”)(好像都是字符串)(主要是为了解决/区分以下情况)
public User(String name,String car)
{
this.name = name;
this.car = car;
}
public User(Integer name,String car)
{
this.name = name;
this.car = car;
}
C.p空间注入(这里使用eclipse发现并不区分属性值首字母大小写)(本质:set方法,记得加上set方法!哎)
1.导入p空间名称 xmln:p=”http://www.springframework.org/schema/p”
2.使用p:属性完后注入
值类型:p:属性名=”值”
对象类型:p:属性名-ref=”bean名称”(这里bean可以是任意形式的bean,比如set注入,比如构造注入)
<bean name="user3" class="cn.itcast.bean.User" p:name="jack" p:age="20" p:car-ref="car">
</bean>
D.spel注入:Spring Expression Language spring表达式语言
<!-- spel注入 -->
<bean name="user4" class="cn.itcast.bean.User">
<property name="name" value="#{user.name}"></property>
<property name="age" value="#{user3.age}"></property>
<property name="car" ref="car2"></property>
</bean>
E.复杂类型注入(数组、list、map、property等,其中数组与list区分一个或者多个,map和property没有区分一个或者多个)
疑惑:后期对象值怎么改变 answer:通过对象的set、get改变
复习:复杂类型注入
<!-- 复杂类型注入 -->
<bean name="cb" class="cn.itcast.c_injection.CollectionBean">
<!-- 如果数组中只准备注入一个值或者引用,使用value/ref即可
<property name="arr" value="tom"></property>
-->
<property name="arr">
<array>
<value>tom</value>
<value>jerry</value>
<ref bean="user4" />
</array>
</property>
<!-- 如果list中只准备注入一个值或者引用,使用value/ref即可
<property name="list" value="jack"></property>
-->
<property name="list">
<list>
<value>tom</value>
<value>jerry</value>
<ref bean="user4" />
</list>
</property>
<property name="map">
<map>
<entry key="url" value="jdbc:mysql:///crm"></entry>
<entry key="user" value-ref="user4"></entry>
<entry key-ref="user3" value-ref="user2"></entry>
</map>
</property>
<!-- prop类型注入 字符串-->
<property name="prop">
<props>
<prop key="driverClass">com.jdbc.mysql.Driver</prop>
<prop key="user">username</prop>
</props>
</property>
</bean>
主体类
package cn.itcast.c_injection;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Properties;
public class CollectionBean {
private Object[] arr; //Êý×éÀàÐÍ×¢Èë
private List list; //list×¢Èë
private Map map; //map×¢Èë
private Properties prop; //propertiesÀàÐÍ×¢Èë
public Object[] getArr() {
return arr;
}
public void setArr(Object[] arr) {
this.arr = arr;
}
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
public Map getMap() {
return map;
}
public void setMap(Map map) {
this.map = map;
}
public Properties getProp() {
return prop;
}
public void setProp(Properties prop) {
this.prop = prop;
}
@Override
public String toString() {
return "CollectionBean [arr=" + Arrays.toString(arr) + ", list=" + list + ", map=" + map + ", prop=" + prop
+ "]";
}
具体路径:H:\Hadoop_eclipse\eclipse-jee-mars-2-win32-x86_64\SSM-ProjectOne\spring_day01