Bean配置文件

Bean

在面向对象的程序中,想要使用某个对象,就需要先实例化这个对象。同样,在Spring中,要想使用容器中的Bean,也需要实例化Bean。实例化Bean有三种方式

  • 构造器实例化

  • 静态工厂实例化

  • 实例工厂实例化

获取bean的三个方式

  • 根据id获取

  • 根据name获取

  • 根据类型获取

//都是通过ApplicationContext.getBean的方式
context.getBean("id");
context.getBean("name");
context.getBean("id",Class.class);

拓展

如果一个类实现了接口,那可以根据接口类型获取bean吗

可以,但是前提是bean唯一

如果一个接口有多个实现类,这些实现类都配置了bean,可以根据接口类型获取bean吗

不可以,因为bean不唯一

  • <bean>标签

    bean的本质是类,

    Spring中的Bean其实就是对实体类的引用,来生产Java类对象,从而实现生产和管理Bean

    Spring容器支持Properties文件和xml文件

    • 用于定义一个由Spring容器管理的对象

    • 告诉Spring:创建并管理这个类的实例

    • id::定义唯一标识符

    • class:指定全类名

    • name:类似id,表示Bean,但可以指定多个别名(,; 空格)

    • scope:指定bean的声明周期,默认是singleton

      • prototype:原型:每次获取Bean都是一个新实例

      • scope默认是singleton单例

      • request:在一次请求中,是单例对象

      • session:在一次会话中,是单例对象

      • application:整个应用的运行当中只有一个Bean实例

注入和赋值

  1. 类有属性:创建对象的过程中,向属性设置值

    • setter注入

    • 构造器注入

//原生写法就是
public Class Student{
    private String studentName;
    private String studentClass;
    //setter和getter方法
    ………………
    //有参和无参构造器
    ………………
}
public Class Main{
    public void static main(String[] args){
        Student s = new Student();
        //set方法注入
        s.setStudentName("狗蛋er");
        //构造方法注入
        Student s  = new Student("狗蛋儿","一年级");
    }
}

setter注入

  1. 创建User类

    public class User {
        private String name;
        private String gender;
    ​
        public String getGender() {
            return gender;
        }
    ​
        @Override
        public String toString() {
            return "User{" +
                    "name='" + name + '\'' +
                    ", gender='" + gender + '\'' +
                    '}';
        }
    ​
        public void setGender(String gender) {
            this.gender = gender;
        }
    ​
        public User(String name, String gender) {
            this.name = name;
            this.gender = gender;
        }
    ​
        public String getName() {
            return name;
        }
    ​
        public void setName(String name) {
            this.name = name;
        }
    ​
        public User(String name) {
            this.name = name;
    ​
            System.out.println("有参构造器被调用");
        }
    ​
        public User() {
            System.out.println("无参构造了");
        }
    }
    ​

  2. 配置

     <bean id="user5" class="com.baor.pojo.User">
            <property name="gender" value="男"/>
            <property name="name" value="狗蛋儿"/>
        </bean>
    ​

  3. 测试

 @Test
    public void testSet(){
        ApplicationContext context = new ClassPathXmlApplicationContext("bean03.xml");
        User user = context.getBean("user5", User.class);
        System.out.println("user = " + user);
    }
​
//user = User{name='狗蛋儿', gender='男'}

构造器注入

<!--    构造器方法-->
    <bean id="user6" class="com.baor.pojo.User">
        <constructor-arg name="gender" value="男"/>
        <constructor-arg name="name" value="狗剩儿"/>
    </bean>
    @Test
    public void testSet(){
        ApplicationContext context = new ClassPathXmlApplicationContext("bean03.xml");
        User user = context.getBean("user6", User.class);
        System.out.println("user = " + user);
    }
无参构造了
有参构造了
user = User{name='狗剩儿', gender='男'}

在此期间发现,明明用的user6但是没有删除的user5也会无参构造一下,

想到 Spring 容器在初始化时,会创建所有定义的单例 bean

所以可以将作用域改成原型(scope="prototype")这样它只会在被显式获取时才会创建

特殊值处理

  • 字面量赋值

spring会 把value的值看做字面量

  • null值

  <bean id="user5" class="com.baor.pojo.User" scope="prototype">
        <property name="gender" value="男"/>
        <property name="name">
            <null/>
        </property>
    </bean><!-- null值处理 -->

  • xml实体

    • 转义字符

      • &lt <

      • &gt >

      • &amp &

  • CDATA节

    • ![CDATA[a<b]]表示里面的特殊符

为对象类型属性赋值

员工类

@Data
public class Emp {
    private Dept dept;
    private String eName;
    private Integer eAge;
    public void work(){
        System.out.println(eName+"在工作"+"年龄:"+eAge);
    }
}

部门类

@Data
public class Dept {
    private String dName;
        public void info(){
            System.out.println("部门的名称"+dName);
        }
}
  • 引入外部Bean

    <!-- 引入外部bean
    1.创建两个类的对象
            2.在emp的bean标签里面,使用property引入dept的bean-->
        <bean id="dept" class="com.baor.pojo.Dept">
            <property name="DName" value="安保部"></property>
        </bean>
        <bean id="emp" class="com.baor.pojo.Emp">
    <!--        普通类型注入-->
            <property name="EName" value="luck"/>
            <property name="EAge"   value="12"/>
    <!--        注入对象类型-->
            <property name="dept" ref="dept"/>
         </bean>

  • 引入内部Bean

<bean id="emp" class="com.baor.pojo.Emp">
<!--        普通类型注入-->
        <property name="ename" value="luck"/>
        <property name="eage"   value="12"/>
<!--        注入对象类型-->
        <property name="dept">
            <bean id="dept" class="com.baor.pojo.Dept">
                <property name="DName" value="安保部"></property>
            </bean>
        </property>
     </bean>
  • 级联赋值

 <bean id="dept" class="com.baor.pojo.Dept">
    </bean>

    <bean id="emp" class="com.baor.pojo.Emp">
<!--        普通类型注入-->
        <property name="ename" value="luck"/>
        <property name="eage"   value="12"/>
<!--        注入对象类型-->
        <property name="dept" ref="dept"/>
        <property name="dept.DName" value="测试部"/>
     </bean>

这个需要实体类中有get方法

  • 数组类型属性赋值

 <bean id="emp" class="com.baor.pojo.Emp">
        <property name="ename" value="狗蛋"/>
        <property name="eage" value="12"/>
        <property name="dept">
            <bean id="dept" class="com.baor.pojo.Dept">
                <property name="DName" value="测试部"/>
            </bean>
        </property>
        <property name="loves">
            <array>
                <value>吃饭</value>
                <value>睡觉</value>
                <value>敲代码</value>
            </array>
        </property>
    </bean>
  • List集合类型

<bean id="empone" class="com.baor.pojo.Emp">
        <property name="ename" value="小杨"/>
        <property name="eage" value="12"/>
        <property name="loves">
            <array>
                <value>打豆豆</value>
                <value>吃饭</value>
                <value>打球</value>
            </array>
        </property>
        <property name="dept" ref="dept"/>
    </bean>
    <bean id="emptwo" class="com.baor.pojo.Emp">
        <property name="ename" value="小娴"/>
        <property name="eage" value="14"/>
        <property name="loves">
            <array>
                <value>读书</value>
                <value>看报</value>
                <value>吃零食</value>
            </array>
        </property>
        <property name="dept" ref="dept"/>
    </bean>
    <bean id="dept" class="com.baor.pojo.Dept">
        <property name="DName" value="技术部"/>
        <property name="empList">
            <list>
                <ref bean="empone"/>
                <ref bean="emptwo"/>
            </list>
        </property>
  • Map集合类

 <bean id="dept1" class="com.baor.pojo.Dept">
        <property name="DName" value="技术部"/>
        <property name="DId" value="1"/>
    </bean>
    <bean id="dept2" class="com.baor.pojo.Dept">
        <property name="DName" value="测试部"/>
        <property name="DId" value="2"/>
    </bean>
    <bean id="emp1" class="com.baor.pojo.Emp">
        <property name="ename" value="样杨艺群"/>
        <property name="eage" value="23"/>
        <property name="loves">
            <array>
                <value>吃饭</value>
                <value>睡觉</value>
                <value>打豆豆</value>
            </array>
        </property>
        <property name="deptMap">
            <map>
                <entry key="1" value-ref="dept1"/>
                <entry key="2" value-ref="dept2"/>

            </map>
        </property>
     </bean>
  • 用util规范

<?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:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                            http://www.springframework.org/schema/util
                             http://www.springframework.org/schema/util/spring-util.xsd">


    <bean id="love1" class="com.baor.pojo.Love">
        <property name="loveName" value="吃屎"/>
    </bean>
    <bean id="love2" class="com.baor.pojo.Love">
        <property name="loveName" value="喝尿"/>
    </bean>
    <bean id="love3" class="com.baor.pojo.Love">
        <property name="loveName" value="打飞机"/>
    </bean>
    <bean id="dept1" class="com.baor.pojo.Dept">
        <property name="DId" value="101"/>
        <property name="DName" value="技术部"/>
    </bean>
    <bean id="dept2" class="com.baor.pojo.Dept">
        <property name="DId" value="102"/>
        <property name="DName" value="测试部"/>
    </bean>
    <util:list id="loveList">
        <ref bean="love1"/>
        <ref bean="love2"/>
        <ref bean="love3"/>
    </util:list>
    <util:map id="deptMap">
        <entry key="101" value-ref="dept1"></entry>
        <entry key="102" value-ref="dept2"/>
    </util:map>
    <bean id="emp" class="com.baor.pojo.Emp">
        <property name="ename" value="杨艺群"/>
        <property name="eage" value="23"/>
        <property name="loves" ref="loveList"/>
        <property name="deptMap" ref="deptMap"/>
    </bean>
</beans>

要改xml规范

<?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:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                            http://www.springframework.org/schema/util
                             http://www.springframework.org/schema/util/spring-util.xsd">
  • p命名空间注入

<?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:util="http://www.springframework.org/schema/util"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                            http://www.springframework.org/schema/util
                             http://www.springframework.org/schema/util/spring-util.xsd">


    <bean id="love1" class="com.baor.pojo.Love">
        <property name="loveName" value="吃屎"/>
    </bean>
    <bean id="love2" class="com.baor.pojo.Love">
        <property name="loveName" value="喝尿"/>
    </bean>
    <bean id="love3" class="com.baor.pojo.Love">
        <property name="loveName" value="打飞机"/>
    </bean>
    <bean id="dept1" class="com.baor.pojo.Dept">
        <property name="DId" value="101"/>
        <property name="DName" value="技术部"/>
    </bean>
    <bean id="dept2" class="com.baor.pojo.Dept">
        <property name="DId" value="102"/>
        <property name="DName" value="测试部"/>
    </bean>
    <util:list id="loveList">
        <ref bean="love1"/>
        <ref bean="love2"/>
        <ref bean="love3"/>
    </util:list>
    <util:map id="deptMap">
        <entry key="101" value-ref="dept1"></entry>
        <entry key="102" value-ref="dept2"/>
    </util:map>

    <bean id="emp" class="com.baor.pojo.Emp" p:ename="杨艺群" p:eage="12" p:loves-ref="loveList" p:deptMap-ref="deptMap"></bean>
</beans>
  • p命名空间

<?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:util="http://www.springframework.org/schema/util"
       xmlns:p="http://www.springframework.org/schema/p"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                            http://www.springframework.org/schema/util
                             http://www.springframework.org/schema/util/spring-util.xsd">


    <bean id="love1" class="com.baor.pojo.Love">
        <property name="loveName" value="吃屎"/>
    </bean>
    <bean id="love2" class="com.baor.pojo.Love">
        <property name="loveName" value="喝尿"/>
    </bean>
    <bean id="love3" class="com.baor.pojo.Love">
        <property name="loveName" value="打飞机"/>
    </bean>
    <bean id="dept1" class="com.baor.pojo.Dept">
        <property name="DId" value="101"/>
        <property name="DName" value="技术部"/>
    </bean>
    <bean id="dept2" class="com.baor.pojo.Dept">
        <property name="DId" value="102"/>
        <property name="DName" value="测试部"/>
    </bean>
    <util:list id="loveList">
        <ref bean="love1"/>
        <ref bean="love2"/>
        <ref bean="love3"/>
    </util:list>
    <util:map id="deptMap">
        <entry key="101" value-ref="dept1"></entry>
        <entry key="102" value-ref="dept2"/>
    </util:map>

    <bean id="emp" class="com.baor.pojo.Emp" p:ename="杨艺群" p:eage="12" p:loves-ref="loveList" p:deptMap-ref="deptMap"></bean>
</beans>

引入外部属性文件

  1. 引入数据库相关依赖

mysql-connector-java

druid

      2. 创建外部属性文件,properties格式,定义数据信息、

jdbc.url = jdbc:mysql://localhost:3306/tieba?useSSL=false&serverTimeZone=UTC&characterEncoding=utf-8
jdbc.userName = root
jdbc.password = 123456
jdbc.driver = com.mysql.cj.jdbc.Driver

    3.  创建spring配置文件,引入context命名空间,引入属性文件,使用表达式完成注入

xmls:context="http://www.springframework.org/schema/context"
xsi:schemaLocation = "http://www/springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context.xsd"d


<context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值