JavaEE——Spring中存取Bean的注解

目录

一、存储Bean对象

1、定义

2、存储方式

(1)、类注解

【1】、@Controller(控制器存储)

【2】、@Service(服务存储)

【3】、@Repository(仓库存储)

【4】、@Component(组件存储)

【5】、@Configuration(配置存储)

(2)、方法注解@Bean

3、重命名Bean

二、获取Bean对象

1、注入关键字@Autowired

(1)、属性注入

(2)、Setter注入

(3)、构造方法注入

2、注入关键字@Resource

3、@Autowired和@Resource的区别

4、解决同一类型多个@Bean报错

[(1)、使用 @Resource 注解](#(1)、使用 @Resource 注解)

[(2)、使用 @Qualifier 注解](#(2)、使用 @Qualifier 注解)


一、存储Bean对象

1、定义

  • @Controller:业务逻辑层;
  • @Service:服务层;
  • @Repository:持久层;
  • @Configuration:配置层;

注:@Controller、@Service、@Repository、@Configuration等注解都是属于@Component的"子类"。

2、存储方式

(1)、类注解

【1】、@Controller(控制器存储)

@Controller
public class UserController {
    public void func1() {
        System.out.println("func1");
    }
}

public class App {
    public static void main(String[] args) {
       ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");
       UserController userController=context.getBean("userController",UserController.class);
       userController.func1();
    }
}

【2】、@Service(服务存储)

@Service
public class UserService {
    public void func2() {
        System.out.println("func2");
    }
}

class App {
    public static void main(String[] args) {
        ApplicationContext context= new ClassPathXmlApplicationContext("spring-config.xml");
        UserService userService =context.getBean("userService",UserService.class);
        userService.func2();
    }
}

【3】、@Repository(仓库存储)

@Repository
public class UserRepository {
    public void func3() {
        System.out.println("func3");
    }
}

class App {
    public static void main(String[] args) {
        ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");
        UserRepository userRepository =context.getBean("userRepository",UserRepository.class);
        userRepository.func3();
    }
}

【4】、@Component(组件存储)

@Component
public class UserComponent {
    public void func4() {
        System.out.println("func4");
    }
}

class App {
    public static void main(String[] args) {
        ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");
        UserComponent userComponent =context.getBean("userComponent",UserComponent.class);
        userComponent.func4();
    }
}

【5】、@Configuration(配置存储)

@Configuration
public class UserConfiguration {
    public void func5() {
        System.out.println("func5");
    }
}

class App {
    public static void main(String[] args) {
        ApplicationContext context=new ClassPathXmlApplicationContext("spring-config.xml");
        UserConfiguration userConfiguration=context.getBean("userConfiguration",UserConfiguration.class);
        userConfiguration.func5();
    }
}

(2)、方法注解@Bean

在Spring框架的设计中,方法注解@Bean要配合类注解才能将对象正常的存储到Spring容器中。

@Component
public class Users {
    @Bean
    public User user1() {
        User user = new User();
        user.setName("张三");
        return user;
    }
}

3、重命名Bean

可以通过设置name属性给Bean对象进行重命名操作,此时我们使用user1就可以获取到User对象。

@Component
public class Users {
    @Bean(name = "user1")
        public User user() {
            User user = new User();
            user.setName("张三");
            return user;
    }
}

这个重命名的name是⼀个数组,因此一个bean可以有多个名字,并且name={}也可以省略。

@Bean({"user1", "user2"})
public User user() {
    User user = new User();
    user.setName("张三");
    return user;
}

二、获取Bean对象

获取 bean 对象也叫做对象装配,是把对象取出来放到某个类中,有时候也叫对象注⼊。
对象装配(对象注⼊)的实现⽅法以下 3 种:属性注⼊、Setter 注⼊、构造⽅法注⼊

1、注入关键字@Autowired

(1)、属性注入

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
@Controller
public class UserController {
    @Autowired
    private UserService userService;

    public void show() {
        System.out.println(userService.name)
    }
}
  • 优点:使用简洁方便
  • 缺点:只能用于 IoC 容器,非 IoC 容器不可用;无法注入被 final 修饰的对象;容易违背单一性原则

(2)、Setter注入

Setter注入和属性的Setter方法类似,但在设置set方法时需要加上@Autowired的注解。

@Controller
public class UserController {
    private UserService userService;
    @Autowired
    public void setUserService(UserService userService) {
        this.userService = userService;
    }

    public void show() {
        System.out.println(userService.name)
    }
}
  • 优点:不容易违背单一性原则
  • 缺点:通用性不如构造方法;无法注入被final修饰的对象;容易被非法调用

(3)、构造方法注入

构造方法注入是在类的构造方法中实现注入的。如果只有一个构造方法,那么@Autowired注解可以省略,但如果类中有多个构造方法,那么需要添加上@Autowired来明确指定到底使用哪个构造方法,否则程序会报错。

@Controller
public class UserController {
    private UserService userService;
    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }

    public void show() {
        System.out.println(userService.name)
    }
}
  • 优点:构造器是Spring推荐的注入方式,同时构造器注入的通用性较强,能够注入被final修饰的对象
  • 缺点:使用复杂

2、注入关键字@Resource

在进行类注入时除了可以使用@Autowired关键字之外,还可以使用@Resource进行注入。

@Controller
public class UserController {
    @Resource
    private UserService userService;

    public void show() {
        System.out.println(userService.name)
    }
}

3、@Autowired和@Resource的区别

  • 出身不同:@Autowired 来自于Spring;@Resource 来自于JDK的注解;
  • 设置参数不同:相比于@Autowired,@Resource支持更多的参数设置;
  • 注入种类不同:@Autowired可用于属性注入、Setter注入和构造函数注入;@Resource只能用于属性注入和Setter注入,不能与于构造函数注入;

4、解决同一类型多个@Bean报错

@Component
public class Users {
    @Bean
    public User user1() {
        User user = new User();
        user.setName("张三");
        return user;
    }
    @Bean
    public User user2() {
        User user = new User();
        user.setName("李四");
        return user;
    }
}

报错的原因是非唯一的Bean对象,解决同一个类型的多个bean的解决方案有以下两个

(1)、使用 @Resource 注解

@Controller
class UserController4 {
    @Resource(name = "user1")
    private User user;
    public User getUser() {
        return user;
    }
}

(2)、使用 @Qualifier 注解

@Controller
public class UserController5 {
    @Autowired
    @Qualifier(value = "user2")
    private User user;
    public User getUser() {
        return user;
    }
}
相关推荐
程序员南飞1 小时前
ps aux | grep smart_webrtc这条指令代表什么意思
java·linux·ubuntu·webrtc
弥琉撒到我1 小时前
微服务swagger解析部署使用全流程
java·微服务·架构·swagger
一颗花生米。2 小时前
深入理解JavaScript 的原型继承
java·开发语言·javascript·原型模式
问道飞鱼2 小时前
Java基础-单例模式的实现
java·开发语言·单例模式
ok!ko6 小时前
设计模式之原型模式(通俗易懂--代码辅助理解【Java版】)
java·设计模式·原型模式
2402_857589366 小时前
“衣依”服装销售平台:Spring Boot框架的设计与实现
java·spring boot·后端
吾爱星辰7 小时前
Kotlin 处理字符串和正则表达式(二十一)
java·开发语言·jvm·正则表达式·kotlin
哎呦没8 小时前
大学生就业招聘:Spring Boot系统的架构分析
java·spring boot·后端
编程、小哥哥8 小时前
netty之Netty与SpringBoot整合
java·spring boot·spring
IT学长编程9 小时前
计算机毕业设计 玩具租赁系统的设计与实现 Java实战项目 附源码+文档+视频讲解
java·spring boot·毕业设计·课程设计·毕业论文·计算机毕业设计选题·玩具租赁系统