Spring:在XML中创建bean对象

目录

set方法赋值

构造方法赋值

Spring中通过XML获得对象 

  给对象属性赋特殊符号

内部注入bean对象

集合类型属性的注入

在XML中使用公共的属性

工厂bean

创建单实列对象和多实列对象

bean的生命周期和后置处理器

引入外部属性文件


set方法赋值

创建 UserDaoIm类的userdao对象

创建UserService类的userService对象,通过类中的set方法为私有属性user赋值为userdao

<bean id="userdao" class="com.pyj.spring5.dao.UserDaoIm"></bean>
<bean id="userService" class="com.pyj.spring5.service.UserService">
    <property name="user" ref="userdao"></property>
</bean>

构造方法赋值

通过类中的构造方法为UserService2赋值。ref接收对象,value接收值

<bean id="userdao2" class="com.pyj.spring5.dao.UserDao2"></bean>
<bean id="userservice" class="com.pyj.spring5.service.UserService2">
   //从外部注入bean对象
   <constructor-arg name="userdao" ref="userdao2"></constructor-arg>
   <constructor-arg name="address" value="中国"></constructor-arg>
</bean>

Spring中通过XML获得对象 

//加载spring配置文件
ApplicationContext context=new ClassPathXmlApplicationContext("XML1.xml");
//获取配置文件创造的对象
UserService2 user=context.getBean("userservice",UserService2.class);
//UserService2 user=(UserService) context.getBean("userservice");

  给对象属性赋特殊符号

<bean id="people" class="com.pyj.spring5.People">
   <property name="name">
        <value><![CDATA[<<四川>>]]></value>
   </property>
</bean>

内部注入bean对象

在student对象内部创建people对象

<!-- 方法一 -->
    <bean id="student" class="com.pyj.spring5.Student">
        <!--设置普通属性-->
        <property name="ID" value="20202107"></property>
        <!--在类内部设置对象类属性-->
        <property name="people">
            <bean id="people" class="com.pyj.spring5.People">
                <property name="name" value="陈百强"></property>
            </bean>
        </property>
    </bean>

<!-- 方法二 外部注入对象内部为对象赋值-->
    <bean id="student2" class="com.pyj.spring5.Student">
        <!--设置普通属性-->
        <property name="ID" value="20202107"></property>
        <!--在类内部设置对象类属性-->
        <property name="people" ref="people1"></property>
        <!--在people中要设置people的get方法-->
        <property name="people.name" value="陈百强"></property>
    </bean>

    <bean id="people1" class="com.pyj.spring5.People"></bean>

集合类型属性的注入

当前的所有集合类型都是String

    <bean id="inte" class="com.pyj.spring5.Integreate">
<!--        创建数组类型的属性-->
        <property name="courses">
            <array>
                <value>数组1</value>
                <value>数组2</value>
            </array>
        </property>
<!--        创建list类型的属性-->
        <property name="list">
            <list>
                <value>list1</value>
                <value>list2</value>
            </list>
        </property>
<!--        创建map类型的属性-->
        <property name="map">
            <map>
                <entry key="键1" value="值1"></entry>
                <entry key="键2" value="值2"></entry>
            </map>
        </property>
    </bean>

当集合的类型为对象时值的注入 

    <bean id="inte2" class="com.pyj.spring5.Inte">
        <property name="list">
            <list>
                <ref bean="user1"></ref>
                <ref bean="user2"></ref>
            </list>
        </property>
    </bean>

    <bean id="user1" class="com.pyj.spring5.User">
        <property name="name" value="陈百强"></property>
        <property name="age" value="35"></property>
    </bean>

    <bean id="user2" class="com.pyj.spring5.User">
        <property name="name" value="张国荣"></property>
        <property name="age" value="43"></property>
    </bean>

在XML中使用公共的属性

使用时需要在spring配置文件中引入名称空间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"<!-- 配置util-->
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                           http://www.springframework.org/schema/utilhttp://www.springframework.org/schema/util/spring-util.xsd"><!-- 配置util-->
<!-- 构建公共的属性值,命名为booklist-->
    <util:list id="booklist">
        <value>纯阳指</value>
        <value>九阳神功</value>
        <value>葵花宝典</value>
    </util:list>

    <bean id="bookclass" class="com.pyj.spring5.service.Inte3">
        <property name="book" ref="booklist"></property>
    </bean>
</beans>

工厂bean

通过实现FactoryBean接口,并重写getObject()方法实现在XML中虽然创建的是Mybean对象,但得到的却是User对象

public class Mybean implements FactoryBean {

    @Override
    public Object getObject() throws Exception {
        User user=new User();
        user.setAge(20);
        user.setName("谭咏麟");
        return user;
    }

}
public class User {
    private String name;
    private int age;

    public User() {
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
<bean id="mybean" class="com.pyj.spring5.service.Mybean"></bean>

结果是User{name='谭咏麟', age=20}

创建单实列对象和多实列对象

通过bean中的scope属性设置,默认情况下创建的对象为单例

<!--创建多例对象-->
<bean id="mybean" class="com.pyj.spring5.service.Mybean" scope="prototype"></bean>
<!--创建单例对象-->
<bean id="mybean" class="com.pyj.spring5.service.Mybean" scope="singleton"></bean>

bean的生命周期和后置处理器

后置处理器(可以在对象初始化前和初始化后调用自身的方法)

1.在XML中配置BOSS的实例对象和后置处理器,在该XML文件中所有的对象在被创建时后置处理器都会发挥作用

    <bean id="boss" class="com.pyj.spring5.Boss" init-method="initMethod" destroy-method="destroyMethod">
        <property name="name" value="大Boss"></property>
    </bean>
<!--配置后置处理器(可以在对象初始化前和初始化后调用自身的方法),在该XML文件中所有的对象在被创建时后置处理器都会发挥作用-->
    <bean id="myBeanPost" class="com.pyj.spring5.MyBeanPost"></bean>

 Boss类

public class Boss {
    private String name;

    public Boss() {
        System.out.println("第一步通过通过无参构造创建实例对象");
    }

    public void setName(String name) {
        this.name = name;
        System.out.println("第二步设置属性");
    }
    public void initMethod(){
        System.out.println("第三步执行初始化方法");
    }
    public void destroyMethod(){
        System.out.println("第五步销毁对象");
    }
}

MyBeanPost类实现了后置处理器接口,并重写了方法

public class MyBeanPost implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("对象初始化之前执行的方法");
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("对象初始化之后执行的方法");
        return bean;
    }
}

测试类

public void test9(){
        ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("XML3.xml");
        Boss boss=context.getBean("boss",Boss.class);
        System.out.println("第四步得到bean对象");
        System.out.println(boss);
        context.close();//手动销毁对象

    }

结果

第一步通过通过无参构造创建实例对象
第二步设置属性
对象初始化之前执行的方法
第三步执行初始化方法
对象初始化之后执行的方法
第四步得到bean对象
com.pyj.spring5.Boss@33723e30
第五步销毁对象

引入外部属性文件

使用时需要在spring配置文件中引入名称空间contex

    <!--    引入外部属性文件-->
    <context:property-placeholder location="classpath:JDBC.properties"/>

    <!--    配置连接池-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="url" value="${jdbc.url}"></property>
        <property name="username" value="${jdbc.username}"></property>
        <property name="password" value="${jdbc.password}"></property>
        <property name="driverClassName" value="${jdbc.driverClassName}"></property>
    </bean>

引入的外部properties文件,注:在引入时properties中的键值不能和mysql的关键字一致

jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.username=root
jdbc.password=20001101pyj
jdbc.driverClassName=com.mysql.cj.jdbc.Driver

测试程序

  public void test10() throws Exception {
        ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext("XML4.xml");
        DataSource dataSource= (DataSource) context.getBean("dataSource");
        Connection connection= dataSource.getConnection();
        System.out.println(connection);
        connection.close();
    }

通过注解创建bean对象和注入属性

此方法可以使XML中的代码干净

使用时需要在spring配置文件中引入名称空间contex,并开启组件扫描(就是扫描注解)

<!--    开启组件扫描-->
<context:component-scan base-package="com.pyj"></context:component-scan>

创建对象并给属性注入值

创建对象的注解

@Component(都可以)、@Service(规范:最好service层)、@Controller(规范:最好web层)、@Reposittory(规范:最好dao层)但四个注解可以混用,只是不规范

属性赋值的注解

Autowired(根据类型)、Qualifier(根据属性名注入,要和Autowired一起使用)、Resource(根据类型、根据属性名注入)、Value(注入常量值)

@Component(value = "user")//user等价与XML中bean的id,如果不写默认是类名且首字母小写
public class User {
    @Autowired//根据类型对属性进行注入
    private UserDao userDao;
    @Autowired
    @Qualifier(value = "userdao2")//Qualifier要和Autowired一起使用
    private UserDao2 userDao2;
    @Resource(name = "userdao3")//既可以实现类型注入亦可以实现属性注入
    private UserDao3 userDao3;
    @Value(value = "张国荣")//常量注入
    private String name;
}

因为属性userDao、userDao2、userDao3是一个对象,所以要在这些对象的类上面添加创建对象的注解

@Component(value = "userdao")
public class UserDao{...}

在java中获得User实例对象

public void test1(){
        ApplicationContext context=new ClassPathXmlApplicationContext("bean2.xml");
        User user=context.getBean("user", User.class);
    }

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值