Spring学习01

来源:互联网 发布:java源码下载 编辑:程序博客网 时间:2024/06/08 19:00

感觉Spring的笔记最清晰,其他太多文字,杂乱,不方便复习,也不方便他人阅读。

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和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方法


原创粉丝点击