• JavaEE 几种spring注解


            使用注解可以更简单的存储Bean对象和读取Bean对象。

    存储Bean对象

    在使用注解之前,需要做一些前置工作:

    1. "1.0" encoding="UTF-8"?>
    2. <beans xmlns="http://www.springframework.org/schema/beans"
    3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    4. xmlns:content="http://www.springframework.org/schema/context"
    5. xsi:schemaLocation="http://www.springframework.org/schema/beans
    6. http://www.springframework.org/schema/beans/spring-beans.xsd
    7. http://www.springframework.org/schema/context
    8. https://www.springframework.org/schema/context/spring-context.xsd">
    9. <content:component-scan base-package="(包名)">
    10. content:component-scan>
    11. beans>

            包名可以类似于com.XXX.        

    注解有两类:类注解和方法注解。

            类注解:@Controller(控制器注解)、@Service(服务注解)、@Repository(仓库注解)、@Component(组件注解)、@Configuration(配置注解)。

            方法注解:@Bean

    类注解

    @Controller(控制器注解)

            如图,在naion包下建立一个controller包,用来存放controller注解的类,类中写了一个UserController。

    类注解需要将注解写在类上。结果如下:

    1. @Controller
    2. public class UserController {
    3. public void sayHi() {
    4. System.out.println("Hi~");
    5. }
    6. }

    然后在com的包下建立一个启动类,命名为StartUp。

            启动类中仍然是老规矩,获取spring上下文,从spring上下文获取Bean对象,使用Bean。要注意xml文件是否正确。

    1. public class StartUp {
    2. public static void main(String[] args) {
    3. ApplicationContext applicationContext =
    4. new ClassPathXmlApplicationContext("spring-config.xml");
    5. UserController userController = applicationContext.getBean("userController", UserController.class);
    6. userController.sayHi();
    7. }
    8. }

    要注意的一点就是getBean中,类名第一个字母应该小写,而不是大写,否则报错。

    @Service(服务存储)

    使用方法和@Controller类似。你可以新创建一个类添加注解,也可以将@Controller注解改为@Service。

    1. @Service
    2. public class UserService {
    3. public void sayHi() {
    4. System.out.println("Hi~");
    5. }
    6. }
    1. public class StartUp {
    2. public static void main(String[] args) {
    3. ApplicationContext applicationContext =
    4. new ClassPathXmlApplicationContext("spring-config.xml");
    5. UserService userService = applicationContext.getBean("userService", UserService.class);
    6. userService.sayHi();
    7. }
    8. }

            其他的三个类注解用法上相似,这里不在累述。五大类注解功能相似,为什么不用一个,而是要分开,主要的原因就是让人们看到类注解之后,直观了解当前类是干嘛的。比如@Controller表示也业务逻辑层、@Service表示服务层、@Repository表示持久层、@Configuration表示配置层。

            前面说,sprin存储类时,类名第一个字母要小写。如果是这样的情况,就不一样了。

    1. @Repository
    2. public class URepository {
    3. public void sayHi() {
    4. System.out.println("Hi, URepository!");
    5. }
    6. }
    1. public class StartUp {
    2. public static void main(String[] args) {
    3. ApplicationContext applicationContext =
    4. new ClassPathXmlApplicationContext("spring-config.xml");
    5. //类名第一个字母和第二个字母都大写
    6. URepository uRepository = applicationContext.getBean("uRepository", URepository.class);
    7. uRepository.sayHi();
    8. }
    9. }

    报错了,这是特殊的情况。我们查看源代码就可以发现问题:

            288行表示,如果第一个字符是大写,且第二个字符也是大写,直接返回该name;否则第一个字符小写后返回。所以,改成下面的代码就不会报错了。

    @Bean方法注解

             @Bean注解需要搭配类注解来使用。@Bean注解,将注解写在方法上。@Bean注解会告诉Spring这个方法将会返回一个对象,该对象要注册为Spring应用上下文中的bean,所以,我们需要先写一个对象出来

    1. public class User {
    2. private int id;
    3. private String name;
    4. private int age;
    5. public int getId() {
    6. return id;
    7. }
    8. public void setId(int id) {
    9. this.id = id;
    10. }
    11. public String getName() {
    12. return name;
    13. }
    14. public void setName(String name) {
    15. this.name = name;
    16. }
    17. public int getAge() {
    18. return age;
    19. }
    20. public void setAge(int age) {
    21. this.age = age;
    22. }
    23. @Override
    24. public String toString() {
    25. return "User{" +
    26. "id=" + id +
    27. ", name='" + name + '\'' +
    28. ", age=" + age +
    29. '}';
    30. }
    31. }

    然后使用@Bean来返回该对象给spring。

    1. @Component
    2. public class UserBeans {
    3. @Bean
    4. public User user() {
    5. User user = new User();
    6. user.setName("a");
    7. user.setAge(1);
    8. user.setId(1);
    9. return user;
    10. }
    11. }
    1. public class StartUp {
    2. public static void main(String[] args) {
    3. ApplicationContext applicationContext =
    4. new ClassPathXmlApplicationContext("spring-config.xml");
    5. User user = applicationContext.getBean("user", User.class);
    6. System.out.println(user);
    7. }
    8. }

    获取Bean对象 

            获取bean对象,把对象取出来放到某个类中。也叫对象装配、对象注入。对象装配有三种方式:属性注入、setter注入、构造方法注入。

            注解有@Autowired和@Resource。

    属性注入

    现在,我想获取UserService。可以直接在启动类中使用@Autowired注解获取到该对象。

    1. @Service
    2. public class UserService {
    3. public void sayHi() {
    4. System.out.println("Hi~");
    5. }
    6. }
    1. public class StartUp {
    2. @Autowired
    3. public UserService userService;
    4. public UserService result() {
    5. return userService;
    6. }
    7. public static void main(String[] args) {
    8. ApplicationContext applicationContext =
    9. new ClassPathXmlApplicationContext("spring-config.xml");
    10. StartUp startUp = new StartUp();
    11. startUp.result();
    12. }
    13. }

             属性注入的优点:简洁,使用很方便。缺点:只能使用在IoC容器上;不能被final修饰;更容易违背单一设计原则。

    Setter注入

    使用set和get方法。

    1. public class StartUp {
    2. public UserService userService;
    3. public UserService getUserService() {
    4. return userService;
    5. }
    6. @Autowired
    7. public void setUserService(UserService userService) {
    8. this.userService = userService;
    9. }
    10. public static void main(String[] args) {
    11. ApplicationContext applicationContext =
    12. new ClassPathXmlApplicationContext("spring-config.xml");
    13. StartUp startUp = new StartUp();
    14. startUp.setUserService(startUp.userService);
    15. }
    16. }

            setter注入的优点:符合单一设计原则。缺点:不能被final修饰;注入的对象可以被修改。

    构造方法注入

    1. public class StartUp {
    2. public static UserService userService;
    3. @Autowired
    4. public StartUp(UserService userService) {
    5. this.userService = userService;
    6. }
    7. public static void main(String[] args) {
    8. ApplicationContext applicationContext =
    9. new ClassPathXmlApplicationContext("spring-config.xml");
    10. StartUp startUp = new StartUp(userService);
    11. }
    12. }

            构造方法注入优点:可以注入被final修饰的对象;注入的对象不会像setter注入那样被修改;可以完全被初始化;通用性更好,不仅仅使用在IoC容器上。

    @Resource

    @Resource不能使用在构造方法上。

    @Autowired和@Resource之间的一些区别:

    (1)出身不同,前者来自spring,后者来自jdk;

    (2)@Resource支持更多的参数;

    (3)@Resource不支持构造方法注入。

  • 相关阅读:
    如何使用注解管理Spring Bean的生命周期呢?
    【springBoot】博客系统
    共识算法——Paxos算法
    Java集合
    【机器学习】带你轻松理解什么是强化学习中的贝尔曼方程
    MySQL数据库与表管理《三国志》为例
    【Python基础】Python文件操作介绍
    Leetcode刷题Day5休息 & Day6----------哈希表
    Spring @Profile注解使用和源码解析
    车道线检测-LSTR-论文学习笔记
  • 原文地址:https://blog.csdn.net/Naion/article/details/127841878