JavaWeb框架————Spring(一)

1、什么是Spring
Spring是一个开源框架,为了解决企业应用开发的复杂性而创建的,主要优势之一就是其分层架构,它的核心是控制反转(IOC)和面向切面(AOP),简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式)轻量级开源框架。
2、Spring的优点

1、方便解耦,简化开发
Spring就是一个大工厂,可以将所有对象创建和依赖关系维护交给Spring管理。
2、AOP编程的支持(所谓AOP就是功能抽取)
Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能。
3、声明事务的支持
只需要通过配置就可以完成对事务的管理,而无需手动编程。
4、方便程序的测试
Spring对Junit4支持,可以通过注解方便的测试Spring程序。
5、方便集成各种优秀框架
Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、Hibernate、MyBatis、Quartz等)的直接支持。
6、降低JavaEE API的使用难度
Spring对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等),都提供了封装,使这些API应用难度大大降低。
这里写图片描述
这里写图片描述

3、Spring搭建
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
4、属性注入
这里写图片描述
这里写图片描述
这里写图片描述

代码示例

Car.java

package cn.ctgu.bean;

public class Car {
    private String name;
    private String color;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getColor() {
        return color;
    }
    public void setColor(String color) {
        this.color = color;
    }
    @Override
    public String toString() {
        return "Car [name=" + name + ", color=" + color + "]";
    }

}

User.java

package cn.ctgu.bean;

public class User {
    private String name;
    private Integer age;
    private Car car;

    public User() {
        System.out.println("User对象空参构造方法!");
        // TODO Auto-generated constructor stub
    }


    public User(String name, Car car) {
        System.out.println("User(String name,Car car)!!");
        this.name = name;
        this.car = car;
    }

    public User(Car car, String name) {
        System.out.println("User(String name,Car car)!!");
        this.name = name;
        this.car = car;
    }
    public User(Integer name, Car car) {
        System.out.println("User(String name,Car car)!!");
        this.name = name+"";
        this.car = car;
    }

    public Car getCar() {
        return car;
    }

    public void setCar(Car car) {
        this.car = car;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public void init() {
        System.out.println("我是初始化方法!");
    }
    public void destroy() {
        System.out.println("我是销毁方法!");
    }

    @Override
    public String toString() {
        return "User [name=" + name + ", age=" + age + ", car=" + car + "]";
    }
}

CollectionBean.java

package cn.ctgu.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/set类型注入
    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
                + "]";
    }

}

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

配置文件applicationContext.xml,在cn.ctgu.bean下(主要是set方式属性注入)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xmlns="http://www.springframework.org/schema/beans"
        xmlns:p="http://www.springframework.org/schema/p"
         xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">
    <!--set方式属性注入:  -->
    <bean name="user" class="cn.ctgu.bean.User">
        <!-- 值类型注入:为User对象中名为name的属性注入tom作为值  -->
        <property name="name" value="tom"></property>
        <property name="age" value="18"></property>
        <!-- 引用类型注入:为car属性注入下方配置的car对象 -->
        <property name="car" ref="car"></property>
    </bean>

    <!-- 将car对象配置到容器中 -->
    <bean name="car" class="cn.ctgu.bean.Car">
        <property name="name" value="兰博基尼"></property>
        <property name="color" value="黄色"></property>
    </bean>

    <bean name="cb" class="cn.ctgu.injection.CollectionBean">
        <!-- 如果数组中只准备注入一个值(对象),直接使用value或ref即可 -->
        <property name="arr" value="tom"></property>
    </bean>

</beans>

这里写图片描述
这里写图片描述
这里写图片描述

配置文件applicationContext.xml(构造函数注入、集合注入),在cn.ctgu.injection下

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xmlns="http://www.springframework.org/schema/beans"
        xmlns:p="http://www.springframework.org/schema/p"
         xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">
    <!--set方式属性注入:  -->
     <bean name="user" class="cn.ctgu.bean.User">
        <!-- 值类型注入:为User对象中名为name的属性注入tom作为值  -->
        <property name="name" value="tom"></property>
        <property name="age" value="18"></property>
        <!--引用类型注入:为car属性注入下方配置的car对象 -->
        <property name="car" ref="car"></property>
    </bean>
    <!-- 将car对象配置到容器中 -->
    <bean name="car" class="cn.ctgu.bean.Car">
        <property name="name" value="兰博基尼"></property>
        <property name="color" value="黄色"></property>
    </bean>

    <!--====================================================-->
    <!-- 构造函数注入 -->
    <bean name="user2" class="cn.ctgu.bean.User">
        <!-- name属性:构造函数的参数名 
            index属性:构造函数的参数索引
            type属性:构造函数的参数类型
        -->
        <constructor-arg name="name" index="0" type="java.lang.Integer" value="999"></constructor-arg>
        <constructor-arg name="car" ref="car" index="1"></constructor-arg>
    </bean>


    <!--===============数组注入======================  -->
    <bean name="cb" class="cn.ctgu.injection.CollectionBean">
        <!-- 如果数组中只准备注入一个值(对象),直接使用value或ref即可 -->
        <property name="arr" value="tom"></property>
    </bean>

    <!--================数组注入多个元素=====================  -->
    <bean name="cd" class="cn.ctgu.injection.CollectionBean">
        <!-- 如果数组中只准备注入一个值(对象),直接使用value或ref即可 -->
        <property name="arr" >
            <array>
                <value>tom</value>
                <value>jerry</value>
                <ref bean="user2"/> 
            </array>
        </property>
    </bean>

    <!--================list注入=====================  -->
    <bean name="list1" class="cn.ctgu.injection.CollectionBean">
        <property name="list" value="jack"></property>
    </bean>

    <!--================列表注入多个元素=====================  -->
    <bean name="list2" class="cn.ctgu.injection.CollectionBean">
        <!-- 如果数组中只准备注入一个值(对象),直接使用value或ref即可 -->
        <property name="list" >
            <list>
                <value>tom</value>
                <value>jerry</value>
                <ref bean="user2"/> <!-- 对象 -->
            </list>
        </property>
    </bean>

    <!--================map注入=====================  -->
    <bean name="map" class="cn.ctgu.injection.CollectionBean">
        <property name="map">
            <map>
                <entry key="url" value="jdbc://"></entry>
                <entry key="user2" value-ref="user2"></entry><!--键为字符串,值为对象 -->
                <entry key-ref="user2" value-ref="user2"></entry><!-- 键为对象,值为对象 -->
            </map>
        </property>
    </bean>

    <!--================properties注入=====================  -->
    <bean name="prop" class="cn.ctgu.injection.CollectionBean">
        <property name="prop">
            <props>
                <prop key="dirverClass">com.jdbc</prop>
                <prop key="userName">root</prop>
                <prop key="password">1234</prop>
            </props>    
        </property> 
    </bean>


</beans>

这里写图片描述
测试类Demo.java(以上几种注入方式的测试类)

package cn.ctgu.injection;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import cn.ctgu.bean.User;

public class Demo {
    //set方式属性注入
        @Test 
        public void fun1() {
            //1、创建容器对象
            ApplicationContext ac=new ClassPathXmlApplicationContext("cn/ctgu/injection/applicationContext.xml");
            //2、向容器"要"user对象
            User u=(User)ac.getBean("user");
            //3、打印user对象
            System.out.println(u);
        }
    //构造函数注入    
        @Test 
        public void fun2() {
            //1、创建容器对象
            ApplicationContext ac=new ClassPathXmlApplicationContext("cn/ctgu/injection/applicationContext.xml");
            //2、向容器"要"user对象
            User u=(User)ac.getBean("user2");
            //3、打印user对象
            System.out.println(u);
        }

        @Test 
        public void fun3() {
            //1、创建容器对象
            ApplicationContext ac = new ClassPathXmlApplicationContext("cn/ctgu/injection/applicationContext.xml");
            //2、向容器"要"user对象
            CollectionBean cb = (CollectionBean) ac.getBean("cb");
            //3、打印user对象
            System.out.println(cb);
        }

        @Test 
        public void fun4() {
            //1、创建容器对象
            ApplicationContext ac = new ClassPathXmlApplicationContext("cn/ctgu/injection/applicationContext.xml");
            //2、向容器"要"user对象
            CollectionBean cd = (CollectionBean) ac.getBean("cd");
            //3、打印user对象
            System.out.println(cd);
        }

        @Test 
        public void fun5() {
            //1、创建容器对象
            ApplicationContext ac = new ClassPathXmlApplicationContext("cn/ctgu/injection/applicationContext.xml");
            //2、向容器"要"user对象
            CollectionBean list1 = (CollectionBean) ac.getBean("list1");
            //3、打印user对象
            System.out.println(list1);
        }

        @Test 
        public void fun6() {
            //1、创建容器对象
            ApplicationContext ac = new ClassPathXmlApplicationContext("cn/ctgu/injection/applicationContext.xml");
            //2、向容器"要"user对象
            CollectionBean list2 = (CollectionBean) ac.getBean("list2");
            //3、打印user对象
            System.out.println(list2);
        }

        @Test 
        public void fun7() {
            //1、创建容器对象
            ApplicationContext ac = new ClassPathXmlApplicationContext("cn/ctgu/injection/applicationContext.xml");
            //2、向容器"要"user对象
            CollectionBean map = (CollectionBean) ac.getBean("map");
            //3、打印user对象
            System.out.println(map);
        }

        @Test 
        public void fun8() {
            //1、创建容器对象
            ApplicationContext ac = new ClassPathXmlApplicationContext("cn/ctgu/injection/applicationContext.xml");
            //2、向容器"要"user对象
            CollectionBean prop = (CollectionBean) ac.getBean("prop");
            //3、打印user对象
            System.out.println(prop);
        }
}

5、创建对象
这里写图片描述
这里写图片描述
这里写图片描述

代码示例

cn.ctgu.bean下的User.java

package cn.ctgu.bean;

public class User {
    private String name;
    private Integer age;
    private Car car;

    public User() {
        System.out.println("User对象空参构造方法!");
        // TODO Auto-generated constructor stub
    }


    public User(String name, Car car) {
        System.out.println("User(String name,Car car)!!");
        this.name = name;
        this.car = car;
    }

    public User(Car car, String name) {
        System.out.println("User(String name,Car car)!!");
        this.name = name;
        this.car = car;
    }
    public User(Integer name, Car car) {
        System.out.println("User(String name,Car car)!!");
        this.name = name+"";
        this.car = car;
    }

    public Car getCar() {
        return car;
    }

    public void setCar(Car car) {
        this.car = car;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    public void init() {
        System.out.println("我是初始化方法!");
    }
    public void destroy() {
        System.out.println("我是销毁方法!");
    }

    @Override
    public String toString() {
        return "User [name=" + name + ", age=" + age + ", car=" + car + "]";
    }


}

cn.ctgu.test下的UserFactory.java

package cn.ctgu.test;

import cn.ctgu.bean.User;

public class UserFactory {
    public static User createUser() {
        System.out.println("静态工厂创建User");
        return new User(); 
    }

    public User createUser2() {
        System.out.println("实例工厂创建User");
        return new User();
    }
}

配置文件applicationContext.xml(cn.ctgu.create下)

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd ">
    <!--创建方式1:空参构造创建对象 -->
    <!-- 
        scope:singleton(默认值) 单例模式,被标识为单例的对象在spring容器中只会存在一个实例
        scope:prototype 多例模式,被标识为多例的对象,每次再获得才会创建,每次创建都是新的对象

        init-method属性:配置一个方法作为生命周期初始化方法,spring会在对象创建之后立即调用
        destroy-method属性:   配置一个方法作为生命周期的销毁方法,spring容器在关闭并销毁所有容器中的对象之前调用

     -->
    <bean name="user" class="cn.ctgu.bean.User" scope="singleton" init-method="init" destroy-method="destroy"></bean>

    <!-- 创建方式2:静态工厂创建 对象
        调用UserFactory的createUser方法创建名为user2的对象,放入容器
    -->
    <bean name="user2"
        class="cn.ctgu.test.UserFactory"
        factory-method="createUser"
    ></bean>

    <!-- 创建方式3:实例工厂创建 对象
        调用UserFactory的createUser2方法创建名为user3的对象,放入容器
    -->
    <bean name="user3"
        factory-bean="userFactory"
        factory-method="createUser2"></bean>

    <bean name="userFactory"
        class="cn.ctgu.test.UserFactory"></bean>

    <!-- 导入其他spring配置文件 -->
    <import resource="cn/ctgu/create/applicationContext.xml"/>
</beans>

测试类Demo.java

package cn.ctgu.test;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import cn.ctgu.bean.User;

public class Demo {
    //创建对象方式一:空参构造创建
    @Test 
    public void fun1() {
        //1、创建容器对象
        ApplicationContext ac=new ClassPathXmlApplicationContext("cn/ctgu/create/applicationContext.xml");
        //2、向容器"要"user对象
        User u=(User)ac.getBean("user");
        //3、打印user对象
        System.out.println(u);
    }

    //创建对象方式二:静态工厂创建对象
        @Test 
        public void fun2() {
            //1、创建容器对象
            ApplicationContext ac=new ClassPathXmlApplicationContext("cn/ctgu/create/applicationContext.xml");
            //2、向容器"要"user对象
            User u=(User)ac.getBean("user2");
            //3、打印user对象
            System.out.println(u);
        }

    //创建对象方式三:实例工厂
        @Test 
        public void fun3() {
            //1、创建容器对象
            ApplicationContext ac=new ClassPathXmlApplicationContext("cn/ctgu/create/applicationContext.xml");
            //2、向容器"要"user对象
            User u=(User)ac.getBean("user3");
            //3、打印user对象
            System.out.println(u);
        }
    //scope:singleton(默认值) 单例模式,被标识为单例的对象在spring容器中只会存在一个实例
    //scope:prototype 多例模式,被标识为多例的对象,每次再获得才会创建,每次创建都是新的对象

        @Test 
        public void fun4() {
            //1、创建容器对象
            ApplicationContext ac=new ClassPathXmlApplicationContext("cn/ctgu/create/applicationContext.xml");
            //2、向容器"要"user对象
            User u=(User)ac.getBean("user");
            User u2=(User)ac.getBean("user");
            User u3=(User)ac.getBean("user");
            User u4=(User)ac.getBean("user");

            System.out.println(u2==u4);//单例:true  多例:false
            //3、打印user对象
            System.out.println(u);
        }

    //测试生命周期属性init 和 destroy方法 
        @Test 
        public void fun5() {
            //1、创建容器对象
            ApplicationContext ac=new ClassPathXmlApplicationContext("cn/ctgu/create/applicationContext.xml");
            //2、向容器"要"user对象
            User u=(User)ac.getBean("user");

            //3、打印user对象
            System.out.println(u);
            //关闭容器,触发销毁方法
            ((AbstractApplicationContext) ac).close();
        }

}

案例————将Spring容器应用到Struts-crm项目中
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值