spring中IOC容器注册和获取bean的实例

spring中常用的功能主要的是ioc和aop,此处主要说明下,实例注册和使用的方法,此为学习后的笔记记录总结

1.使用xml文件配置

在idea中创建maven工程,然后创建实例Person,然后在配置文件中配置bean,具体代码如下所示:,

public class Person {
    private String name;
    private Integer age;

    public Person(){
        super();
    }

    public Person(String name,Integer age){
        super();
        this.name=name;
        this.age=age;
    }

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

    public String getName() {
        return name;
    }

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

    public Integer getAge() {
        return age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="user" class="com.enjoy.cap1.Person">
        <property name="name" value="zhangsan"/>
        <property name="age" value="23"/>
    </bean>
</beans>
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * 类说明
 *
 * @Date: 2019/5/1 14:54
 * @Version: 1.0
 */
public class MainTest1 {
    public static void main(String []args){
        ApplicationContext ac=new ClassPathXmlApplicationContext("beans.xml");
        Person person= (Person) ac.getBean("user");
        System.out.println(person);
    }
}

以上是使用xml文件配置实现的bean的注册和使用,运行结果如下所示:

----------------------------------------------------------------------------
2.下面使用注解的方式进行bean的注册与使用
首先需要一个配置文件,本例使用MainConfig.java,实例同上Persion,测试文件MainTest.java文件
代码如下所示:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 类说明
 *
 * @Date: 2019/5/1 14:56
 * @Version: 1.0
 */
@Configuration
public class MainConfig {


    @Bean
    public Person person(){
        return new Person("lisi",20);
    }
}
 
public class MainTest2 {
    public static void main(String []args){
        ApplicationContext app=new AnnotationConfigApplicationContext(MainConfig.class);
        Person person= (Person) app.getBean("person");
        System.out.println(person);
    }
}

运行结果如下所示:

 针对以上情况的特殊说明:
1)在获取bean的实例时,xml配置文件中给出class指定类的全路径名,id指定Bena的名称,是通过反射创建对象(Person)的实例,
创建时需要有构造器,否则会在运行时提示bean构造报错;或者使用默认的构造器,或者自己创建带参的构造器,在注入的时候设置构造器参数,
对象的创建是有spring容器来创建和管理,而不是对象本身,通过依赖注入完成对象的依赖关系。
2)使用注解方式实现bean的注册时,可以通过构造器的名字进行改写,或者通过bean标签指定bean的名字,而不是固定的实体类的构造器名字,
一般默认情况是构造器的名字。注解可以使用扫描配置或者import等标签配置使用其他标签

若是不想直接改方法的名字,可以在@Bean标签后面直接指定bean的名字,如下截图所示:

测试时使用注解中的测试类即可。此处不再进行测试说明。

3)以上是bean的注册使用说明,但若是类特别多,则配置起来就会特别繁琐,增加工作量,此时就可以通过扫描标签帮助注册bean实例,

      代码说明如下所示;

    

@Configuration
@ComponentScan(value = "com.enjoy.cap2")
public class MainConfig {
}

测试类的代码如下所示:

public class Test02 {

    @Test
    public void test(){
        AnnotationConfigApplicationContext app=new AnnotationConfigApplicationContext(MainConfig.class);
        String [] names=app.getBeanDefinitionNames();
        for (String name:names){
            System.out.println(name);
        }
    }
}

实体类不变,程序的运行结果如下所示;

 4)在spring的容器中注册bean时默认是单例的,因为在整个容器中,通过id获取的时候,id值是唯一的,在容器启动时就创建并放到容器中(容器是一个map对象)

可以在配置文件中通过标签进行配置,在bean配置处,增加@Scope(“prototype”) ,可以实现多例,配置文件修改的代码如下所示:

测试类不变,在运行后会得出false的执行结果。

5)虽然spring容器中bean的注册默认是单例的,但可以通过标签@Lazy来指定获取对象时在进行bean实例的创建,而不是在容器启动时创建bean实例

      不配置懒加载标签时,程序代码及运行结果如下所示;

package com.enjoy.cap4.config;

import com.enjoy.cap1.Person;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 类说明
 *
 * @Date: 2019/5/1 16:16
 * @Version: 1.0
 */
@Configuration
public class MainConfig {

    @Bean
    public Person person(){
        System.out.println("在容器中添加Person类的bean实例");
        return new Person("zhangsan",11);
    }
}
public class Test04 {
    public static void main(String []args){
        AnnotationConfigApplicationContext app=new AnnotationConfigApplicationContext(MainConfig.class);
        System.out.println("IOC容器创建完成........");
        app.getBean("person");
    }
}

程序的运行结果为;

若在配置文件中的bean实例上添加Lazy标签,代码如下所示:

猜你喜欢

转载自www.cnblogs.com/guopengxia0719/p/10800078.html