Spring-03-bean的作用域和使用注解开发

六、Bean的作用域

  • Bean的作用域

    image-20201118152138365

6.1 singleton作用域

  • singleton是bean的默认作用域

  • 不管你怎么使用,Spring容器在创建对象的时候只创建一个,每次从容器中获取的Bean都是同一个对象

    singleton

6.2 prototype作用域

  • 和singleton相对应的,每次从容器中获取对象时,Spring都会创建一个新的对象交给你

  • 也就是说每次拿到的对象都是不同的对象

    prototype

6.3 其他的作用域

  • request, session, application, websocket 这些作用域只有在使用Spring-web容器时才会生效,不然则会抛出异常

  • Request

    • 当一个bean的作用域为Request,表示在一次HTTP请求中,一个bean定义对应一个实例;

    • 即每个HTTP请求都会有各自的bean实例,它们依据某个bean定义创建而成。

      <bean id="loginAction" class=cn.csdn.LoginAction" 1 scope="request"/>
      
    • 针对每次HTTP请求,Spring容器会根据loginAction bean的定义创建一个全新的LoginAction bean实例,且该loginAction bean实例仅在当前HTTP request内有效,因此可以根据需要放心的更改所建实例的内部状态,而其他请求中根据loginAction bean定义创建的实例,将不会看到这些特定于某个请求的状态变化。当处理请求结束,request作用域的bean实例将被销毁。

  • Session

    • 当一个bean的作用域为Session,表示在一个HTTP Session中,一个bean定义对应一个实例。

      <bean id="userPreferences" class="com.foo.UserPreferences" scope="session"/>
      
    • 针对某个HTTP Session,Spring容器会根据userPreferences bean定义创建一个全新的userPreferences bean实例,且该userPreferences bean仅在当前HTTP Session内有效。

    • 与request作用域一样,可以根据需要放心的更改所创建实例的内部状态,而别的HTTP Session中根据userPreferences创建的实例,将不会看到这些特定于某个HTTP Session的状态变化。

    • 当HTTP Session 最终被废弃的时候,在该HTTP Session作用域内的bean也会被废弃掉。

七、使用注解开发

7.1 准备工作

  • 确保maven项目中已经正确的添加了aop依赖

  • 在spring配置文件中,引入相关的约束

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

7.2 注册Bean

  • 告诉Spring,哪些类需要被托管

    <!--选择需要扫描注解的包-->
    <context:component-scan base-package="com.pbx.pojo"/>
    
  • 在类名上添加 @Component 注解,如果注解中不传递名称,bean默认的id就是全小写的类名

    package com.pbx.pojo;
    
    import org.springframework.stereotype.Component;
    
    @Component("u1")
    public class User {
        private int id;
        private String name;
    }
    
  • 对于这样配置的Bean,它的id为 “u1",如果没有给出,那么默认的id为user

  • 扩展内容

    • @Component 注解有三个衍生注解,他们分别对应了web开发中的三个层,不过功能都是一样的
      • @Controller —— web层
      • @Service —— service层
      • @Repository —— dao层

7.3 注入属性值

  • 在需要注入值的属性或者setter方法上使用 @Value() 进行注入属性值

  • 通过注解属性,只能实现一些值的注入,不能注入引用类型以及List等复杂类型的属性

  • 实体类

    package com.pbx.pojo;
    
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.stereotype.Component;
    
    @Component("u1")
    public class User {
        @Value("1")
        private int id;
    
        @Value("张三")
        private String name;
    
        @Override
        public String toString() {
            return "User{" +
                    "id=" + id +
                    ", name='" + name + '\'' +
                    '}';
        }
    }
    
  • 测试

    @Test
    public void test02() {
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        User u1 = context.getBean("u1", User.class);
        System.out.println(u1);
    }
    

    image-20201121143515131

7.4 @Autowired

  • @Autowired注解是通过类型进行自动装配的,如果有多个同类型的bean,则需要配合@Qualifier(value = "beanid") 指定某个特定的bean

  • 实体类

    public class People {
        private String name;
    
        @Autowired
        private Cat cat;
    
        @Autowired
        private Dog dog;
    }
    
  • 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:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
            https://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context
            https://www.springframework.org/schema/context/spring-context.xsd">
    
        <context:annotation-config/>
    
        <bean id="cat1" class="com.pbx.pojo.Cat">
            <property name="name" value="cat1"/>
        </bean>
        <bean id="dog1" class="com.pbx.pojo.Dog">
            <property name="name" value="dog1"/>
        </bean>
    
        <bean id="people" class="com.pbx.pojo.People">
            <property name="name" value="张三"/>
        </bean>
    
    </beans>
    
  • 测试

    @Test
    public void test01() {
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        People people = context.getBean("people", People.class);
        people.show();
    }
    

    image-20201120145109216

7.5 作用域

  • @Scope
    • singleton:默认的,Spring会采用单例模式创建这个对象。关闭工厂 ,所有的对象都会销毁。
    • prototype:多例模式。关闭工厂 ,所有的对象不会销毁。内部的垃圾回收机制会回收

7.6 基于Java类配置Spring

  • 以上都是使用xml文件和注解配合进行开发的。这里介绍的就是完全使用Java机制进行配置Spring,完全不需要xml文件

  • JavaConfig是通过Java类的方式来提供Bean的定义信息,不需要依赖任何的xml文件

  • 编写配置类

    @Configuration
    public class MyConfig {
        
        
        @Bean
        public User getUser() {
            return new User();
        }
    }
    
  • 实体类

    @Component
    public class User {
    
        @Value("1")
        private int id;
    
        @Value("李四")
        private String name;
    
        @Override
        public String toString() {
            return "User{" +
                    "id=" + id +
                    ", name='" + name + '\'' +
                    '}';
        }
    }
    
  • 测试

    @Test
    public void test01() {
        ApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);
        User getUser = context.getBean("getUser", User.class);
        System.out.println(getUser);
    }
    

    image-20201121155327948

  • 注意

    • 使用配置类配置Spring时,方法名就是原来bean标签中的id,返回值类型就是以前bean标签中的class
posted @ 2020-11-21 16:18  PrimaBruceXu  阅读(123)  评论(0编辑  收藏  举报