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()方法)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

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