Spring介绍:为开发者提供一站式的轻量级应用开发框架。
降低开发难度:
基于POJO的轻量级和最小侵入性编程;
通过依赖注入和面向接口实现松耦合;
基于切面和惯例进行声明式编程;
通过切面和模板减少样板式代码
IOC(控制反转):简单容器(实现BeanFactory(每次获得对象时才会创建)接口);高级容器ApplicationContext上下文(实现更多接口,面向框架特性,每次容器启动都会创建容器中配置的所有对象。)
DI(依赖注入):依赖的资源延迟到运行时从配置注入
AOP:动态代理和cglib代理,实现切面编程,简化相同代码。
0,导包:4+2,即spring下core/context/beans/expression+apache下commons.logging/log4j
(ps:logging和log4j要导入,不然出现异常/错误找半天)
1,创建简单类(如User),设置set、get、toString方法及构造器(有参、无参)以供测试。
2,配置applicationContext.xml文件(<import resource="otherapplicationContext.xml"></import>可导入其他配置文件)
导入以上对应xsd约束到beans标签属性中
bean标签设置name/id和class属性
bean对象创建:
a,构造器创建,bean标签设置好name和class就可以创建bean对象
<bean name="userFactory" class="com.cl.bean.UserFactory"></bean>即可
b,静态工厂创建,即调用class中的静态方法创建对象。在bean标签中添加factory-method属性,属性名为class类下的静态方法名,此静态方法返回想创建的对象
<bean name="User" class="com.cl.bean.UserFactory"
factory-method="createUser"></bean>
c,实例工厂创建,即调用class中的一般方法创建对象。这里分2步,首先用一个bean标签创建此类对象(如UserFactory),然后将此bean的name属性赋给最后要创建的bean(User)的factory-bean,即:
<bean name="userFactory" class="com.cl.bean.UserFactory"></bean>
<bean name="User" class="com.cl.bean.UserFactory"
factory-bean="userFactory" factory-method="createUser"></bean>
对象创建的注解方式:
@Configuration
public class test(){
@Bean
public User getUser(){
return new User();
}
}
注入:
a,set注入,配置set和get方法,在bean标签下设置property,property的属性name为class类中的字段,value或ref为要注入的值或引用类型对象,如
<bean name="car" class="com.cl.bean.Car">
<property name="name" value="兰博基尼"></property>
<property name="color" value="红色"></property>
</bean>
b,构造器注入,其中index为赋值给构造器中第几个索引,type为参数类型,当然引用就用ref,如
<constructor-arg name="name" value="小王" index="0" type="String"></constructor-arg>或<constructor-arg name="car" ref="car" index="2"></constructor-arg>
c,p名称空间(还有个c名称空间,好像跟p是一样的用法)注入(准备工作:beans里导入xmlns:p="http://www.springframework.org/schema/p)
ps:p/c名称空间可以简化代码(分别对应setter和构造器注入),缺点是不能装配集合。
<bean name="User" class="com.cl.bean.User" p:name="小刚"
p:id="20" p:car-ref="car"></bean>
util命名空间可以装配集合,如:
<bean class="testDemo.XXX">
<util:list id="list">
<value>...</value>
<value>...</value>
</util:list>
</bean>
util名称空间对应什么方式(即需要set方法还是构造器)注入呢……
d,spel(表达式语言)注入,可使用其他bean的属性赋值,如
<bean name="User2" class="com.cl.bean.User">
<property name="name" value="#{User.name}"></property>(调用User的name)
<property name="id" value="#{User.id}"></property>
<property name="car" ref="car"></property>
</bean>
e,复杂类型注入,以下展示数组、list、map和properties的注入
<bean name="cb" class="com.cl.bean.CollectionDemo">
<!-- array注入 -->
<property name="arr">
<array>
<value>tom</value>
<value>jim</value>
<ref bean="User" />
</array>
</property>
<!-- list -->
<property name="list">
<list>
<value>haha</value>
<ref bean="User" />
</list>
</property>
<!-- map-->
<property name="map">
<map>
<entry key="1" value="haha"></entry>
<entry key="2" value="hehe"></entry>
<entry key-ref="User" value-ref="User21"></entry>
</map>
</property>
<!-- properties -->
<property name="prop">
<props>
<prop key="driverclass">com.jdbc.mysql.Driver</prop>
<prop key="userName">root</prop>
<prop key="password">root</prop>
</props>
</property>
</bean>
3,测试类,使用applicationContext.xml获得ApplicationContext(应该是加载进去解析用的),调用getBean方法(参数为设置bean时的name),然后强转即可得到一个对象,接下来就是通常java操作了。
User u=(User)new ClassPathXmlApplicationContext("applicationContext.xml").getBean("User"或者User.class);
以上ClassPathXmlApplicationContext可以调用close方法关闭,ApplicationContext无close方法