五、Spring中使用注解方式管理bean

1 入门程序

1.1 创建实体类

@Component()
public class TUser {
    private String name;
    private String sex;
    private Integer age;
    private Date brithday;
    private IdCard idcard;
    private List<String> product;
    private Set<String> product2;
    //省略其他
    
       
}

1.2 修改配置文件

  • 约束条件
  • 声明扫描范围
<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
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd">
    
     <context:component-scan base-package="com.yiwu.pojo"/>

1.3 测试方法

import com.yiwu.pojo.TUser;
import org.springframework.context.support.ClassPathXmlApplicationContext;

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

        TUser tuser = (TUser)applicationContext.getBean("TUser");
        System.out.println(tuser);
        System.out.println(aaa("UTser"));
    }
}

1.4 声明注解细节

@Component注解细节

  • 类的注解,声明此类被Spring容器进行管理,相当于bean标签的作用
  • @Component(value=“类的别名”) value属性用于制定当前bean的id属性,或者叫别名。
  • value属性也可以省略,若省略有以下两种情况:
    • 一般情况别名为当前类名首字母改小写,其他字母大小写不变。
    • 若前类名两个字母都为大写,则别名为原类名。(参考源码

@Controller、@Service、@Repository

  • 这三个注解也可以将类声明给Spring管理,他们主要是语义上的区别

  • @Controller注解主要声明将控制器类配置给Spring管理,例如Servlet

  • @Service注解主要声明业务处理类配置给Spring管理,Service接口的实现类

  • @Repository注解主要声明持久化类配置给Spring管理,DAO接口

  • @Component除了控制器,Service,DAO之外的类一律使用此注解声明

在这里插入图片描述

2 单例/多例模式

@Scope()

  • 类注解,用于声明当前类单例模式还是非单例模式,相当于bean标签的scope属性

  • @Scope(“prototype”) 表示当前类为非单例模式(默认单例模式)

@Lazy()

  • 类注解,用于声明一个单例模式的bean是否为懒汉模式
  • @Lazy(true) 表示声明为懒汉模式,默认为饿汉模式

2.1 单例饿汉模式

默认模式

TUser添加注解与无参构造函数。

@Component("tuser")
public class TUser {
    private String name;
    private String sex;
    private Integer age;
    private Date brithday;
    private IdCard idcard;
    private List<String> product;
    private Set<String> product2;
     public TUser() {
        System.out.println("生成对象");
    }
}

测试代码

import com.yiwu.pojo.TUser;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MyTest01 {
    public static void main(String[] args) {

        System.out.println("容器开始初始化");
        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext(" applicationContext.xml");
        System.out.println("容器初始化完成");
        System.out.println("开始获取实例");
        TUser tuser1 = (TUser)applicationContext.getBean("tuser");
        System.out.println("第一次获取完成");
        TUser tuser2 = (TUser)applicationContext.getBean("tuser");
        System.out.println("获取实例完成");
        System.out.println(tuser1);
        System.out.println(tuser2);
    }

执行结果

实例在容器初始化的时候生成,每次从容器获取的是同一个实例

容器开始初始化
生成对象
容器初始化完成
开始获取实例
第一次获取完成
获取实例完成
com.yiwu.pojo.TUser@52e677af
com.yiwu.pojo.TUser@52e677af

2.2 单例懒汉模式

TUser添加@Lazy(true)注解

@Component("tuser")
@Lazy(true)
public class TUser {
    private String name;
    private String sex;
    private Integer age;
    private Date brithday;
    private IdCard idcard;
    private List<String> product;
    private Set<String> product2;

    public TUser() {
        System.out.println("生成对象");
    }
}

执行结果

实例在第一次获取对象时候生成,之后每次获取的是同一个实例。

容器开始初始化
容器初始化完成
开始获取实例
生成对象
第一次获取完成
获取实例完成
com.yiwu.pojo.TUser@55a1c291
com.yiwu.pojo.TUser@55a1c291

2.3 原型/多例模式

TUser添加@Scope(“prototype”)注解

在该模式下,所有实例都是在获取实例时生成。

@Component("tuser")
@Scope("prototype")
public class TUser {
    private String name;
    private String sex;
    private Integer age;
    private Date brithday;
    private IdCard idcard;
    private List<String> product;
    private Set<String> product2;

    public TUser() {
        System.out.println("生成对象");
    }
}

执行结果

容器开始初始化
容器初始化完成
开始获取实例
生成对象
第一次获取完成
生成对象
获取实例完成
com.yiwu.pojo.TUser@5b0abc94
com.yiwu.pojo.TUser@75c072cb

2.4 其他相关注解

@PostConstruct

​ 方法注解,声明一个方法为当前类的初始化方法(在构造器之后执行),相当于bean标签的init-method属性

@PreDestroy

  • 方法注解,声明一个方法为当前类的销毁方法(在对象销毁之前执行),相当于bean标签的destory-method属性。

@Autowired

  • 属性注解、方法注解(set)声明当前属性自动装配,默认byType,默认必须(如果没有找到类型与属性类型匹配的bean则抛出异常)

  • @Autowired(required = false) 通过required属性设置当前自动装配是否为必须(默认必须——如果没有找到类型与属性类型匹配的bean则抛出异常)

  • @Qualifier(“a”) 通过id(有多个重复类型的情况下用此方法)

@Component("aaa")
public class Clazz {
    private  Integer id;   
    private  Integer number;
}
@Autowired(required = false)
public void setClazz1(@Qualifier("aaa") Clazz clazz1) {
    this.clazz1 = clazz1;
}

@Resource

  • 属性注解,也用于声明属性自动装配
  • 默认装配方式为byName,如果根据byName没有找到相应的bean,则继续根据byType寻找对应的bean,根据byType如果没找到bean,或者找到不止一个类型匹配的bean则抛出异常。
@Component("clazz1")
public class Clazz {
    private  Integer id;
    private  Integer number;
}
@Resource
private  Clazz clazz1;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老去的90后

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值