Spring:Bean的配置及注解

搭建环境

pom.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>chapter07</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>5.0.8.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>5.0.8.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-expression</artifactId>
            <version>5.0.8.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.0.8.RELEASE</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aop</artifactId>
            <version>5.0.8.RELEASE</version>
        </dependency>
    </dependencies>


</project>

applicationContext.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:context="http://www.springframework.org/schema/context"
       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/context
        http://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 通过构造器注入成员变量的值 -->
    <bean id="student" class="com.qfedu.bean.Student">
        <constructor-arg name="sid" value="1"/>
        <constructor-arg name="name" value="ZhangSan"/>
        <constructor-arg name="age" value="20"/>
        <constructor-arg name="course" value="Java"/>
    </bean>

    <bean id="teacher" class="com.qfedu.bean.Teacher">
        <property name="tid" value="1"></property>
        <property name="name" value="LiSi"></property>
    </bean>

    <bean id="mix" class="com.qfedu.bean.Mix">
<!--        注入List-->
        <property name="myList">
            <list>
                <value>list01</value>
                <value>list02</value>
            </list>
        </property>
        <!--        注入map-->
        <property name="myMap">
            <map>
                <entry key="key01" value="map01"></entry>
                <entry key="key02" value="map02"></entry>
            </map>
        </property>
        <!--        注入array-->
        <property name="myArray">
            <array>
                <value>array01</value>
                <value>array02</value>
            </array>
        </property>
    </bean>
<!--school测试1-->
<!--    <bean id="school" class="com.qfedu.bean.School">-->
<!--        <property name="stu">-->
<!--            <ref bean="student"></ref>-->
<!--        </property>-->
<!--    </bean>-->
<!-- school测试2-->
<!--    <bean id="school" class="com.qfedu.bean.School">-->
<!--        <property name="stu" ref="student"></property>-->
<!--    </bean>-->
<!--school测试3-->
    <bean id="school" class="com.qfedu.bean.School" p:sid="1" p:stu-ref="student"></bean>

<!--    SpEL注入-->
    <bean id="employee" class="com.qfedu.bean.Employee">
        <property name="eid" value="1"></property>
        <property name="name" value="WangWu"></property>
        <property name="department" value="研发部"></property>
    </bean>
    <bean id="person" class="com.qfedu.bean.Person">
        <property name="pid" value="#{employee.eid}"></property>
        <property name="name" value="#{employee.name}"></property>
    </bean>
<!--    Bean的配置-->
    <bean id="person01" class="com.qfedu.bean.Person"></bean>
    <bean id="person02" class="com.qfedu.bean.Person" scope="prototype"></bean>
<!--    Bean的生命周期-->
<!--    <bean id="bean01" class="com.qfedu.bean.Bean01" init-method="init">-->
<!--        <property name="bid" value="1" />-->
<!--        <property name="name" value="xiaoqian"></property>-->
<!--    </bean>-->
<!--    <bean id="bean02" class="com.qfedu.bean.Bean02">-->
<!--        <property name="bid" value="1" />-->
<!--        <property name="name" value="xiaoqian"></property>-->
<!--    </bean>-->
<!--    <bean id="bean03" class="com.qfedu.bean.Bean03" destroy-method="close">-->
<!--        <property name="bid" value="1" />-->
<!--        <property name="name" value="xiaoqian"></property>-->
<!--    </bean>-->
<!--    <bean id="bean04" class="com.qfedu.bean.Bean04">-->
<!--        <property name="bid" value="1" />-->
<!--        <property name="name" value="xiaoqian"></property>-->
<!--    </bean>-->
<!--    注解-->
    <context:component-scan base-package="com.qfedu.bean"></context:component-scan>
</beans>

1 Bean的配置

1.1 注入方式

1.1.1 注入集合

Mix.class

package com.qfedu.bean;

import java.util.Arrays;
import java.util.List;
import java.util.Map;

public class Mix {
    private List<String> myList;
    private Map<String,String> myMap;
    private String[] myArray;

    //set方法

    public void setMyList(List<String> myList) {
        this.myList = myList;
    }

    public void setMyMap(Map<String, String> myMap) {
        this.myMap = myMap;
    }

    public void setMyArray(String[] myArray) {
        this.myArray = myArray;
    }

    //toString方法

    @Override
    public String toString() {
        return "Mix{" +
                "myList=" + myList +
                ", myMap=" + myMap +
                ", myArray=" + Arrays.toString(myArray) +
                '}';
    }
}

TestSpring03.class

package com.qfedu.test;

import com.qfedu.bean.Mix;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestSpring03 {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new
                ClassPathXmlApplicationContext("applicationContext.xml");
        Mix mix = applicationContext.getBean("mix", Mix.class);
        //输出Mix类对象的信息
        System.out.println(mix);
    }
}

TestSpring03测试结果
Alt

1.1.2 注入其它Bean

School.class

package com.qfedu.bean;

public class School {
    private int sid;
    private Student stu;
//    get/set方法
    public int getSid() {
        return sid;
    }

    public void setSid(int sid) {
        this.sid = sid;
    }

    public Student getStu() {
        return stu;
    }

    public void setStu(Student stu) {
        this.stu = stu;
    }
}


TestSpring04.class

package com.qfedu.test;

import com.qfedu.bean.School;
import com.qfedu.bean.Student;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestSpring04 {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        School school = applicationContext.getBean("school", School.class);
//        通过school获取student对象,并输出Student对象的xinxi
        Student stu = school.getStu();
        System.out.println(stu);
    }
}



TestSpring04测试结果
Alt

Alt

1.1.3 使用P:命名空间注入

TestSpring05.class

package com.qfedu.test;

import com.qfedu.bean.School;
import com.qfedu.bean.Student;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestSpring05 {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        School school = applicationContext.getBean("school", School.class);
        int sid = school.getSid();
        System.out.println("sid:"+sid);
        Student stu = school.getStu();
        System.out.println(stu);
    }
}

TestSpring05测试结果
Alt

1.1.4 使用SpEL注入

Person.class

package com.qfedu.bean;

public class Person {
    private int pid;
    private String name;

    public void setPid(int pid) {
        this.pid = pid;
    }

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

    @Override
    public String toString() {
        return "Person{" +
                "pid=" + pid +
                ", name='" + name + '\'' +
                '}';
    }
}

TestSpring06.class

package com.qfedu.test;

import com.qfedu.bean.Person;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestSpring06 {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        Person person = applicationContext.getBean("person", Person.class);
        System.out.println(person);
    }
}



TestSpring06测试结果
Alt

1.2 Bean的作用域

测试说明singleton返回共享实例,prototype返回新的实例。

TestSpring07.class

package com.qfedu.test;

import com.qfedu.bean.Person;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestSpring07 {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//        person01实例
        Person person01_1 = applicationContext.getBean("person01", Person.class);
        Person person01_2 = applicationContext.getBean("person01", Person.class);
//        person01实例
        Person person02_1 = applicationContext.getBean("person02", Person.class);
        Person person02_2 = applicationContext.getBean("person02", Person.class);
//        判断两次获取的实例是否相等
        System.out.println(person01_1==person01_2);
        System.out.println(person02_1==person02_2);
    }
}

TestSpring07测试结果
Alt

1.3 Bean的生命周期

1.3.1 Bean实例初始化之前

Bean01.class

package com.qfedu.bean;

public class Bean01 {
    private String bid;
    private String name;

    public Bean01() {
    }

    public String getBid() {
        return bid;
    }

    public void setBid(String bid) {
        this.bid = bid;
    }

    public String getName() {
        return name;
    }

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

    @Override
    public String toString() {
        return "Bean01{" +
                "bid='" + bid + '\'' +
                ", name='" + name + '\'' +
                '}';
    }

    public void init(){
        System.out.println("Bean的初始化完成,调用init()方法");
        System.out.println(this.toString());
    }
}


Bean02.class

package com.qfedu.bean;

import org.springframework.beans.factory.InitializingBean;

public class Bean02 implements InitializingBean {
    private String bid;
    private String name;
//无参构造
    public Bean02() {
    }

    public String getBid() {
        return bid;
    }

    public void setBid(String bid) {
        this.bid = bid;
    }

    public String getName() {
        return name;
    }

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

    @Override
    public String toString() {
        return "Bean02{" +
                "bid='" + bid + '\'' +
                ", name='" + name + '\'' +
                '}';
    }

    public void afterPropertiesSet() throws Exception {
        System.out.println("Bean的初始化完成,调用afterPropertiesSet()方法");
        System.out.println(this.toString());
    }
}

TestSpring08.class

package com.qfedu.test;

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

public class TestSpring08 {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
    }
}

TestSpring08测试结果
Alt

Alt

1.3.2 Bean实例销毁之前

Bean03.class

package com.qfedu.bean;

public class Bean03 {
    private String bid;
    private String name;

    public Bean03() {
    }

    public String getBid() {
        return bid;
    }

    public void setBid(String bid) {
        this.bid = bid;
    }

    public String getName() {
        return name;
    }

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

    @Override
    public String toString() {
        return "Bean03{" +
                "bid='" + bid + '\'' +
                ", name='" + name + '\'' +
                '}';
    }

    public void close(){
        System.out.println("Bean实例即将销毁,调用claose()方法");
        System.out.println(this.toString());
    }
}

Bean04.class

package com.qfedu.bean;

import org.springframework.beans.factory.DisposableBean;

public class Bean04 implements DisposableBean {
    private String bid;
    private String name;

    public Bean04() {
    }

    public String getBid() {
        return bid;
    }

    public void setBid(String bid) {
        this.bid = bid;
    }

    public String getName() {
        return name;
    }

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

    @Override
    public String toString() {
        return "Bean04{" +
                "bid='" + bid + '\'' +
                ", name='" + name + '\'' +
                '}';
    }

    public void destroy() throws Exception {
        System.out.println("Bean实例即将销毁,调用destroy() 方法");
        System.out.println(this.toString());
    }
}

TestSpring09.class

package com.qfedu.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestSpring09 {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//        关闭容器,此时Bean实例即将被销毁
        AbstractApplicationContext ac = (AbstractApplicationContext) applicationContext;
        ac.registerShutdownHook();
    }
}

TestSpring09测试结果
Alt
Alt

2 注解

Sch.class

package com.qfedu.bean;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

@Component("sch")
@Scope(scopeName = "singleton")
public class Sch {
    @Value("005")
    private String sid;
    @Autowired
    @Qualifier("stu")
    private Stu stu;

    public String getSid() {
        return sid;
    }

    public void setSid(String sid) {
        this.sid = sid;
    }

    public Stu getStu() {
        return stu;
    }

    public void setStu(Stu stu) {
        this.stu = stu;
    }

    @Override
    public String toString() {
        return "Sch{" +
                "sid='" + sid + '\'' +
                ", stu=" + stu +
                '}';
    }

    @PostConstruct
    public void init(){
        System.out.println("Bean的初始化完成,调用init()方法");
    }
    @PreDestroy
    public void destroy(){
        System.out.println("Bean的初始化完成,调用destroy()方法");
    }
}

TestSpring10.class

package com.qfedu.test;

import com.qfedu.bean.Sch;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class TestSpring10 {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
        Sch sch = applicationContext.getBean("sch", Sch.class);
        System.out.println(sch);
        AbstractApplicationContext ac = (AbstractApplicationContext) applicationContext;
        ac.registerShutdownHook();
    }
}

2.1 先导包

Alt

2.2 修改applicationContext.xml配置

Alt
TestSpring10测试结果
Alt

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring中有多种方式来定义和管理bean的生命周期。其中包括使用XML配置注解和使用JSR250中的@PostConstruct和@PreDestroy注解。 1. XML配置方式:在XML配置文件中,可以使用<bean>标签来定义bean,并通过指定init-method和destroy-method属性来指定bean的初始化和销毁方法。例如: ```xml <bean id="user" class="com.demo.pojo.User" init-method="init" destroy-method="destroy"> </bean> ``` 在这个例子中,init-method属性指定了bean的初始化方法为"init",destroy-method属性指定了bean的销毁方法为"destroy"。 2. 注解方式:使用注解可以更简洁地定义bean的生命周期。可以使用注解@Bean来标注一个方法,该方法返回一个bean实例,并可以使用@PostConstruct和@PreDestroy注解来指定初始化和销毁方法。例如: ```java @Configuration public class AppConfig { @Bean(initMethod = "init", destroyMethod = "destroy") public User user() { return new User(); } } ``` 在这个例子中,@Bean注解标注的方法user()返回一个User实例,并通过initMethod和destroyMethod属性指定了初始化和销毁方法。 3. 使用JSR250中的@PostConstruct和@PreDestroy注解:可以在bean类中使用@PostConstruct和@PreDestroy注解来标注初始化和销毁方法。例如: ```java public class User { @PostConstruct public void init() { // 初始化方法的逻辑 } @PreDestroy public void destroy() { // 销毁方法的逻辑 } } ``` 在这个例子中,@PostConstruct注解标注的方法init()会在bean初始化之后调用,@PreDestroy注解标注的方法destroy()会在bean销毁之前调用。 总结起来,Spring提供了多种方式来定义和管理bean的生命周期,包括XML配置注解和使用JSR250中的@PostConstruct和@PreDestroy注解。这些方式可以根据具体的需求和项目的特点来选择和使用。[1][2][3]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值