Spring-002-bean管理(XML文件配置)

Bean实例化的方式

  • 在spring里面通过配置文件创建对象

  • bean实例化三种方式实现

    • 使用类的无参数构造创建(重点/主要使用)
    <bean id="user" class="com.ljy.spring.User"></bean>
    

    如果类里面没有无参构造则会出错

    • 使用静态工厂创建

    创建一个静态方法,返回类对象

    <!--使用静态工厂创建对象  -->
     <bean id="bean2" class="com.ljy.spring2.Bean2Factory" factory-method="getBean2"></bean>
    
    • 使用实例工厂创建

    创建不是静态的方法,返回类对象

    <!--实例工厂创建对象  --> 
    <!--创建工厂对象  --> 
    <bean id = "bean3Factory" class="com.ljy.bean.Bean3Factory"></bean>
    <bean id="bean3" factory-bean="bean3Factory" factory-method="getBean3"></bean>
    
    
    

bean标签常用属性

  1. id属性
    给bean起名字,id属性值名称不能包含特殊符号,根据id得到配置对象
  2. class属性
    创建对象所在的类的全路径
  3. name属性
    跟id属性一样,但是id属性值不能包含特殊符号 但是name属性值里面可以包含特殊符号,不过目前都用id
  4. scope属性
    属性值有
    • singleton:默认值,单例的 对象只能创建一次
    • prototype: 多例的 每次创建都是一个新的对象
    • request:创建对象把对象放在request域里面
    • session:创建对象吧对象放在session里
    • globalSession:创建对象把对象放在globalSession里面全局Session 单点登录

属性注入

  1. 创建对象时候 向类的属性设置值
  2. 属性注入的方式(三种)
    1. set注入
      image
      image
    2. 有参数构造注入
      image
      image
    3. 接口注入 不常用
      image
      image
  3. spring中只支持前两种方式
    1.使用有参构造函数注入(不常用)
    applicationContex.xml:
    <!--  使用有参数构造注入属性 -->   
    <bean id="demo" class="com.ljy.property.PropertyDemo1">
    <!-- 使用有参构造 -->
    <constructor-arg name="username" value="xiaohong"></constructor-arg>
    </bean>   
    
    
    public class PropertyDemo1 {
    private String username;
    
    public PropertyDemo1(String username) {
        super();
        this.username = username;
    }
    public void test1(){
        System.out.println("demo1++++"+username);
    }
    

}

2.使用set注入

public class Book {
    private String bookname;


    public String getBookname() {
        return bookname;
    }


    public void setBookname(String bookname) {
        this.bookname = bookname;
    }


    public void demobook(){
        System.out.println("book:"+bookname);
    }
}
<bean id="book" class="com.ljy.property.Book">
        <!-- 属性注入 name属性名称 value属性值 -->
        <property name="bookname" value="西游记"></property>
    </bean> 

注入对象类型属性

  1. 创建 service类和dao类

    1. 在service得到dao对象:
  2. 具体实现过程

    1. 在Service里面擦dao作为类型属性
    2. 生成dao类型的属性的set方法
    public class UserService {
    //定义一个dao类型属性  
        private UserDao userDao;
        //生成set方法
        public void setUserDao(UserDao userDao) {
            this.userDao = userDao;
        }
    }
    
    <!-- 注入 对象类型属性-->
    <bean id="userDao" class="com.ljy.ioc.UserDao"></bean>
    <bean id="userService" class="com.ljy.ioc.UserService">
        <!-- 注入dao对象 现在不用value属性 因为不是字符串 而是对象 而要换做ref属性:dao配置bean标签中id值 -->
        <property name="userDao" ref="userDao"></property> <!-- 这里创建了userDao的对象 并注入给userService的UserDao类型的属性 -->
    </bean>
    
    
    
    

P名称空间注入

public class Person {
    private String pname;

    public void setPname(String pname) {
        this.pname = pname;
    }
    public void test1(){
        System.out.println("person..."+pname);
    }
}
<!-- p名称空间注入 -->  
    <bean id="person" class="com.ljy.property.Person" p:pname="lucy"></bean>

注入复杂类型

  1. 数组
  2. list集合
  3. map集合
  4. properties类型
<bean id="person" class="com.ljy.property.Person">
        <!-- arrs -->
        <property name="arrs">
            <list>
                <value>lily</value>
                <value>lucy</value>
                <value>jack</value>
            </list>
        </property>
        <!-- list -->
        <property name="list">
            <list>
                <value>李四</value>
                <value>张三</value>
                <value>王五</value>
            </list>
        </property>
        <!-- map -->
        <property name="map">
            <map>
                <entry key="aa" value="小李"></entry>
                <entry key="bb" value="小张"></entry>
                <entry key="cc" value="小王"></entry>
            </map>
        </property>
        <!-- properties -->
        <property name="properties">
            <props>
                <prop key="driverclass">com.mysql.jdbc.Driver</prop>
                <prop key="username">root</prop>
            </props>
            
        </property>
    </bean>
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Properties;

public class Person {
    private String pname;
    private String[] arrs;
    private List<String> list;
    private Map<String,String> map;
    private Properties properties;
    public void setPname(String pname) {
        this.pname = pname;
    }
    public void setArrs(String[] arrs) {
        this.arrs = arrs;
    }
    public void setList(List<String> list) {
        this.list = list;
    }
    public void setMap(Map<String, String> map) {
        this.map = map;
    }
    public void setProperties(Properties properties) {
        this.properties = properties;
    }
    public void test1(){
        System.out.println("person..."+pname);
        System.out.println("arrs..."+Arrays.toString(arrs));
        System.out.println("list..."+list);
        System.out.println("map..."+map);
        System.out.println("Properties..."+properties);
    }
}

输出结果:


image

IOC和DI的区别

IOC:控制反转,把对象创建交给spring进行配置
DI: 依赖注入, 向类里面的属性注入值
关系:依赖注入不能单独存在,需要在ioc基础之上完成操作

Spring整合web项目

  1. 加载spring核心配置文件
    //加载spring配置文件,根据创建对象
    ApplicationContext context = new ClassPathXmlApplicationContext("applicationContex.xml");
    
    1. new对象,功能可以实现,效率很低
  2. 实现思想:把家在配置文件和创建对象的过程,在服务器启动时候完成
  3. 实现原理
    1. ServletContext对象
    2. 监听器
    3. 具体使用:
      • 在服务器启动时候,为每个项目创建一个ServletContext对象
      • 在ServletContext对象创建的时候,使用监听器可以具体到ServletContext对象在什么时候创建
      • 使用监听器监听到ServletContext对象创建时候,
        • 加载spring配置文件,把配置文件配置对象创建
        • 把创建对象放到ServletContext域对象里面(setAttribute方法)
      • 获取对象时候,到ServletContext域得到(getAttribute()方法)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,133评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,682评论 3 390
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,784评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,508评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,603评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,607评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,604评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,359评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,805评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,121评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,280评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,959评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,588评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,206评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,193评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,144评论 2 352

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,617评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,647评论 18 139
  • 来源:关于Spring IOC (DI-依赖注入)你需要知道的一切作者:zejian Dao层(AccountDa...
    杨井阅读 5,333评论 0 27
  • 假如心灵还有委屈,心灵会有委屈吗?我想说会的,一定会有!因为只要我们还存活于世上,只要我们还在呼吸,就会有喜乐转...
    8ae649cc071c阅读 400评论 0 1
  • 雨过天晴,夜跑三十公里,备战10月23日洪泽湖半马和11月6日爱跑群半马。遗憾的是,又跑迷路了,本来想自己跑个全马...
    李常宏Robin阅读 238评论 1 1