Spring注释配置Bean

Posted 红颜莫知己

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring注释配置Bean相关的知识,希望对你有一定的参考价值。

一、通过注释配合Bean

  • 通过配置context的publicId,Uri即定义的名字空间的前缀context

pubilicId

http://www.springframework.org/schema/context

Uri

https://www.springframework.org/schema/context/spring-context.xsd

名字空间

xmlns:context="http://www.springframework.org/schema/context

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

</beans>

1.Component注释

我们在beanFactory.xml中添加Component-scan标签,指定spring扫描哪些包下的所类中的注解(包括包下的子包)

 <context:component-scan base-package="edu.xalead"/>

User实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
@Component
public class User {
    private int id;
    private String name;
    private int age;
    private String sex;
}

测试

  1. 我们用名字去取,

工厂默认配置的名字为实体类名第一个字母小写
User --> user

public void test1(){
        BeanFactory beanFactory = new ClassPathXmlApplicationContext("beanFactory.xml");
        Object user = beanFactory.getBean("user");
        System.out.println(user);
    }

我们也可以指定名字,在通过指定的名字取

@Component("user")
public class User {
    private int id;
    private String name;
    private int age;
    private String sex;
}
  • 我们也可以通过类去取
public void test1(){
        BeanFactory beanFactory = new ClassPathXmlApplicationContext("beanFactory.xml");
        User user = beanFactory.getBean(User.class);
        System.out.println(user);
    }

结果是一样的
在这里插入图片描述

2.和@Compent功能一样的注解

@Controller 主要用到web层

@Service 服务service层

@Repository 数据访问层 dao层

他们本质其实是一样的,相当于一个别名,由于我们在开发的时候要分层,为了在项目中好区分,所以起了不一样的名字

3.Value注解

@Value("2020")
private int id;
@Value("张三")
private String name;
@Value("18")
private int age;
@Value("男")
private String sex;

但其实这样注解没有什么意义,我们完全可以自己赋值,而且还比这样方便,所以我们一般不使用它

 private int id = 2020;

至于集合我们只能用xml配置,无法用Value来注释

private String[] photos;
private List<String> list;
private Set<String> set;
private Map<Integer , String> map;

4.Scope注释指定单例或多例

@Scope默认是单例模式,即scope=“singleton”,我们可以不写

@Scope("singleton")
public class User {}

scope="prototype"为多例模式

@Scope("prototype")
public class User {}

另外scope还有requestsessionglobal session作用域。

5. @Autowired、@Qualifier(“ser”)、@Resource

假设我想在UserServlet中注入UserDao,我们首先将这两个类都放入工厂中,之后子将userDao注入UserServlet中

UserDao实体类

@Component
public class UserDao {
    public User findUser(){
        User user = null;//new User(1000, "张三", 18, "男","2000-01-01");
        return user;
    }
}

UserServlet实体类

@Component
public class UserServlet {
    @Autowired
    @Qualifier("userDao")
    private UserDao userDao;
    public void findUser(){
        System.out.println("Spring工厂示例");
        System.out.println(userDao.findUser());
    }
}

或者我们直接使用@Resource

@Component
public class UserServlet {
  	@Resource("userDao")
    private UserDao userDao;
    public void findUser(){
        System.out.println("Spring工厂示例");
        System.out.println(userDao.findUser());
    }
}

若我们有一个接口UserDao,两个实现了接口UserDao,那我们需要用不同的名字来注入,比如像这样

@Resource("userDao1")
@Resource("userDao2")

我们大多数情况都是用@Resource

6.生命周期相关注解

我们可以在任何类中加入声明周期的执行,比如初始化、销毁

  • 初始化:@PostConstruct
@PostConstruct
public void init(){};
  • 销毁:@PreDestroy
@PreDestroy
public void destroy(){};

若有误,请指教!

以上是关于Spring注释配置Bean的主要内容,如果未能解决你的问题,请参考以下文章

如何将属性值注入使用注释配置的 Spring Bean?

在 Spring java 配置中调用 @Bean 注解的方法

如何按名称覆盖 Spring 服务 bean,仅使用注释

spring练习,在Eclipse搭建的Spring开发环境中,使用set注入方式,实现对象的依赖关系,通过ClassPathXmlApplicationContext实体类获取Bean对象(代码片段

Spring Batch @Primary 注释覆盖不正确的bean

带有 PropertyPlaceholderConfigurer bean 的 Spring @Configuration 文件不解析 @Value 注释