Spring框架基础学习(二)

创建一个spring项目

上一篇文章中介绍了IOC控制反转及DI依赖注入的思想,在之前的项目开发中new一个对象是我们自己做的,如果使用Spring框架的话,创建对象这份工作由我们自己执行反转给spring帮我们执行.Spring是一个容器,他将帮我们管理对象

这里使用Myeclipse创建一个简单的spring项目.
步骤1:新建一个web项目
步骤2:右击src-->Myeclipse-->add Spring Capabilities

image.png

步骤3:选择要引入的jar包,next-->finsh
image.png

这样就完成了,向web项目中引入spring所需jar包,并创建了applicationContext.xml配置文件
也可自行去spring官网下载jar包,进行导入
https://repo.spring.io/release/org/springframework/spring/

将自定义对象由自己创建移交给spring创建

1.首先先创建两个类User和Pet,使用javabean创建原则


public class User {
    private int uid;
    private String username;
    private String password;
    
    //加入宠物字段
    private Pet upet;
    
    
    public User(String username, Pet upet) {
        System.out.println("String, pet");
        this.username = username;
        this.upet = upet;
    }
    public User(Integer username, Pet upet) {
        System.out.println("方法二:int, pet");
        this.username = username.toString();
        this.upet = upet;
    }
    public User(Pet upet,Integer username) {
        System.out.println("方法三:int, pet");
        this.username = username.toString();
        this.upet = upet;
    }
    public Pet getUpet() {
        return upet;
    }
    public void setUpet(Pet upet) {
        this.upet = upet;
    }
    public User(){
        System.out.println("User 对象空参构造");
    }
    public int getUid() {
        return uid;
    }
    public void setUid(int uid) {
        this.uid = uid;
    }
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    
    
    @Override
    public String toString() {
        return "User [uid=" + uid + ", username=" + username + ", password="
                + password + ", upet=" + upet + "]";
    }
    public void userInit(){
        System.out.println("user init");
    }
    
    public void userDestory(){
        System.out.println("user destory");
    }
    

}

Pet类

package bean;

public class Pet {
    private String petType;
    private String color;
    public String getPetType() {
        return petType;
    }
    public void setPetType(String petType) {
        this.petType = petType;
    }
    public String getColor() {
        return color;
    }
    public void setColor(String color) {
        this.color = color;
    }
    @Override
    public String toString() {
        return "Pet [petType=" + petType + ", color=" + color + "]";
    }
    

}

2.在applicationContext.xml中配置bean

<?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:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<!-- name是起一个名字,我们可以通过这个name来利用容器获取对象 
    name可以使用特殊字符.可重复(但一般不重复) -->
<!-- id与name作用基本相同,但不推荐使用,不能支持特殊字符不能重复  -->
<!-- class是被管理对象的全报名,spring会通过这个包来创建对象  -->
<!-- request在web环境下,如果scope属性为request那么这个对象被创建出来,他的生命周期会与request请求一致  -->
<bean name="user" class="bean.User" lazy-init="true" scope="singleton" init-method="userInit" destroy-method="userDestory">
    <property name="uid" value="2"></property>
</bean>

</beans>

3.使用一个测试类进行测试

package test;

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

import bean.User;

public class HelloSpring {
    //在之前项目开发中new对象使我们自己做的
    @Test
    public void Test1(){
        User u = new User();
        u.setUid(1);
        System.out.println(u);
    }
    //IOC的反转:创建对象这份工作由我们自己执行反转给spring帮我们执行;
    //IOC的控制:就是由Spring帮我们负责创建销毁对象,掌控对象的生命周期等,我们在需要使用对象的是有跟Spring申请即可;
    //IOC是一种编程思想,也是一种新的设计模式.他需要DI(依赖注入)的支持
    //Spring是一个容器,他将帮我们管理对象
    @Test
    public void Test2(){
        //根据spring配置文件获取容器对象
        //ApplicationContext配置的所有bean都会子啊容器创建的时候被创建出来
        //如果配置的bean较多,那么创建容器的时候,会产生内存过大的问题,这种情况在机械性能比较落后的时候比较明显
        //延迟加载lazy-init为true就是创建容器时不加载配置的bean对象,在获取的时候才创建;
        //scope="singleton"默认值是 单例的只创建一个对象  "prototype"多力例,在获取的时候创建新的对象,但在特殊情况下需要使用多例的
        ApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
        //User u=(User)ac.getBean("user");//法一
        //通过getBean获取配置好的user对象(程序员向spring容器要对象)
        User u=ac.getBean(User.class);//法二 通过User字节码对象获得
        System.out.println(u);
    }
     @Test
     public void Test3(){
        
        //scope="singleton"默认值是 单例的只创建一个对象  "prototype"多力例,在获取的时候创建新的对象,但在特殊情况下需要使用多例的
         ClassPathXmlApplicationContext ac=new ClassPathXmlApplicationContext("applicationContext.xml");
        
        User u1=ac.getBean(User.class);//法二 通过User字节码对象获得
        User u2=ac.getBean(User.class);
        User u3=ac.getBean(User.class);
        System.out.println(u1==u2);
        //关闭容器对象,就会触发bean的destorymethod(单例时才能销毁)
        ac.close();
     }
}

通过使用Junit Test 测试Test2方法可得到以下执行结果


image.png

可见spring帮我们创建了对象,并注入了初始值

属性注入

属性注入分为三种形式
1.set注入
这要求要实现注入的类,设置set()方法
applicationContext.xml配置如下

<bean name="user" class="bean.User" lazy-init="true" scope="singleton" init-method="userInit" destroy-method="userDestory">
    <property name="uid" value="2"></property>
    <property name="username" value="小明"></property>
    <property name="password" value="123456"></property>
    <!--引用类型的注入  -->
    <property name="upet" ref="dog"></property>
</bean>

<!-- 将pet对象交给spring容器管理 -->
<bean name="dog" class="bean.Pet">
    <property name="petType" value="二哈"></property>
    <property name="color" value="红色"></property>

</bean>

<property/>进行属性配置,ref可实现引用

2.构造方法注入
要求被注入属性的类,实现有参构造方法

<!--构造方法注入  -->
<bean name="user1" class="bean.User">
<!--name调用构造方法的参数名称 value是注入值类型 ref注入引用类型  -->
<!-- type 是指定 参数的类型 -->
<!-- index 指定参数位置 -->
    <constructor-arg name="username" value="55" type="java.lang.Integer" index="0"></constructor-arg>
    <constructor-arg name="upet" ref="dog" index="1"></constructor-arg>
    
</bean>

3.复杂属性注入
这里是指对数组,list,set,map,properties类型的属性注入
新建一个包含上述类型的类

package bean;

import java.util.*;

public class MyCollection {

    //数组
    private Object[] array;
    //list
    private List list;
    //set
    private Set set;
    //map
    private Map map;
    //properties
    private Properties prop;
    public Object[] getArray() {
        return array;
    }
    public void setArray(Object[] array) {
        this.array = array;
    }
    public List getList() {
        return list;
    }
    public void setList(List list) {
        this.list = list;
    }
    public Set getSet() {
        return set;
    }
    public void setSet(Set set) {
        this.set = set;
    }
    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 "MyCollection [array=" + Arrays.toString(array) + ", list="
                + list + ", set=" + set + ", map=" + map + ", prop=" + prop
                + "]";
    }
}

applicationContext.xml配置属性

<bean name="collection" class="bean.MyCollection">
    <!--array  -->
    <property name="array">
        <array>
            <value>123</value>
            <value>abc</value>
            <ref bean="dog"/>
        </array>
    </property>
    
    <!--list  -->
    <property name="list">  
        <list>
            <value>456</value>
            <value>vcvc</value>
            <ref bean="user1"/>
        </list>
    </property>
    
    <!--set  -->
    <property name="set">   
        <set>
            <value>798</value>
            <value>aaa</value>
            <ref bean="user1"/>
        </set >
    </property>
    
    <!--map  -->
    <property name="map">
        <map>
        <entry key="username" value="root"></entry>
        <entry key="password" value="123456"></entry>
        <entry key-ref="user1" value-ref="dog"></entry>

        </map>
    </property>
    
    <!--properties  -->
    <property name="prpo">
        <props>
        <prop key="name">小花</prop>
        <prop key="age">23</prop>
        </props>
    </property>
</bean>
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容