Spring~用注解储存bean(类注解、方法注解)

文章目录

  • 如何更简单的储存spring
  • 配置扫描路径
  • 类注解介绍:
    • 类注解之间的关系
  • 举例:
    • @Controller
    • @Servie
    • @Repository
    • @Component
  • 注意点:
  • 方法注解

前面我们了解到,如果想要将一个对象储存到spring中,需要以下几个步骤:
1.创建 maven文件
2.在 pom.xml中引入spring依赖包
3.创建一个配置xml文件,存放bean对象
4.在测试类中,通过上下文对象来获取bean对象进行调用

每次想要存入bean对象时,都需要到配置的xml文件中进行修改,是非常麻烦的。为了使存储和读取对象更简单,能直接在代码中进行操作,spring提供了注解的方式来解决这个问题。

Spring的核心是IOC,就是将bean对象初始化并加载到容器中,将bean加载到容器中,有两种方式:配置XML文件或者使用Spring注解。这里介绍的就是后者,操作简单,方便管理,可以提高开发效率。

如何更简单的储存spring

1.创建一个maven文件
2.添加spring核心包
3.配置xml文件,在文件中配置扫描路径
4.在代码中直接使用注解读取和储存

以前需要在储存一个bean对象时,需要手动的在配置文件中创建bean,这里直接配置一个扫描路径,将所有需要储存的对象放到该目录下,当我们用在代码中用注解标识该类时,spring会自动的扫描这个路径,将对应的对象自动添加到spring框架中。

配置扫描路径

在使用注解之前,我们需要配置扫描路径,将所有的对象直接放在该路径下,spring会自动扫描对应的bean并添加到框架中。

创建一个xml配置文件:


<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:content="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">
    <content:component-scan base-package="model">content:component-scan>
beans>

这里的base-package属性中写入对象存放的路径,这里是放在了model包下。
Spring~用注解储存bean(类注解、方法注解)_第1张图片
配置完成后,就可以使用注解了。

注解很多的分类,类注解、方法注解,后面还会介绍的事务模块注解、springMVC注解等等,从广义上可以分为两类:一类是注册Bean,一类是使用Bean.这里先了解一些简单常用的注解,这些注解都可以划分到第一大类中–注册Bean.
类注解:@Configuration、@Controller、@Servie、@Repository、@Component 。
方法注解:@Bean.

类注解介绍:

问:Spring是如何知道需要将哪些Javal类注册到容器中?
答:使用配置文件或者注解的方式来标识需要处理的Java类。

类注解也可以称为组件类注解,即把一些类当做组件进行使用。

@Component:标识一个普通的bean类
@Controller:标识一个控制器组件类,一般用在控制前后端交互的类中,进行数据校验。
@Service :标识一个业务逻辑组件类,进行数据的组装。
@Repository:标识一个DAO组件类,即数据访问层组件,用来访问数据,像连接数据库,进行增删查改操作。
@Configuration:标识一个类作为加载spring的配置类,这个类的作用是配置spring并启动spring容器。

类注解之间的关系

Spring~用注解储存bean(类注解、方法注解)_第2张图片
@Component、@Controller、@Service、@Repository这四个注解实际上一类注解,功能相同,用法相同,区别在于标识当前类是什么组件类型,方便程序员快速了解当前类的作用。

@Component可以替代@Controller、@Service、@Repository,因为这三个注解是被@Component标注的,从逻辑上可以理解为是Component的子类。

如下图:
Controller、Service、Repository三者都是被Component标注。
Spring~用注解储存bean(类注解、方法注解)_第3张图片Spring~用注解储存bean(类注解、方法注解)_第4张图片
Spring~用注解储存bean(类注解、方法注解)_第5张图片
Spring~用注解储存bean(类注解、方法注解)_第6张图片

举例:

@Controller

UserController类作为bean:

package model;

import org.springframework.stereotype.Controller;

@Controller //将当前类储存到Spring,标识此类为控制交互层
public class UserController {
    public void firstUseController(String name){
        System.out.println("Hi,Controller:"+name);
    }
}

在测试类中使用:

import model.HelloApplicationContext;
import model.UserController;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
    public static void main(String[] args) {
      ApplicationContext context=new ClassPathXmlApplicationContext("spring.xml");
     UserController userController=(UserController) context.getBean("userController");
     userController.firstUseController("Hello!");
    }
}

输出:

Hi,Controller:Hello!

@Servie

UserService作为bean:

package model;

import org.springframework.stereotype.Service;

@Service //将此类储存到String中,这个类中可以进行数据组装
public class UserService {
    public void firstUseService(String name){
        System.out.println("Hi,Service:"+name);
    }
}

在测试类中使用:

import model.HelloApplicationContext;
import model.UserController;
import model.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
    public static void main(String[] args) {
      ApplicationContext context=new ClassPathXmlApplicationContext("spring.xml");
      UserService userService=(UserService) context.getBean("userService");
      userService.firstUseService("Hello!");
    }
}

输出:

Hi,Service:Hello!

@Repository

package model;

import org.springframework.stereotype.Repository;

@Repository//将此类储存到String中,标识此类是数据访问组件
public class UserRepository {
    public void firstUseRepository(String name){
        System.out.println("Hi,Repository:"+name);
    }
}

在测试类中使用:

import model.HelloApplicationContext;
import model.UserController;
import model.UserRepository;
import model.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
    public static void main(String[] args) {
      ApplicationContext context=new ClassPathXmlApplicationContext("spring.xml");
      UserRepository userRepository=(UserRepository) context.getBean("userRepository");
      userRepository.firstUseRepository("Hello!");
    }
}

输出:

Hi,Repository:Hello!

@Component

package model;

import org.springframework.stereotype.Component;

@Component 
public class UserComponent {
    public void firstUseComponent(String name){
        System.out.println("Hi,Component:"+name);
    }
}

在测试类中使用:

import model.*;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class App {
    public static void main(String[] args) {
      ApplicationContext context=new ClassPathXmlApplicationContext("spring.xml");
      UserComponent userComponent=(UserComponent) context.getBean("userComponent");
      userComponent.firstUseComponent("Hello!");
    }
}

输出:

Hi,Component:Hello!

注意点:

  • 被注解的Java类会被当做Bean对象储存到spring中,这个对象的默认名称是类名的首字母小写,其余部分不变。
    Spring~用注解储存bean(类注解、方法注解)_第7张图片
  • @Service也可以自定义Bean名称,但是必须唯一
  • 尽量使用对应的组件注解来替换@Component,因为未来的Spring版本中,@Controller,@Service,@Repository可能会携带更多语义

方法注解

方法注解:@Bean.注解在方法前,作用是让这个方法产生一个Bean对象,然后这个Bean对象交给容器进行管理。这个方法只会spring只会调用一次,然后将这个对象放入自己的IOC容器中。

package model;

import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

@Component
public class UserBean {
    private String name;
    private int Id;
    private int age;
    public void setName(String name) {
        this.name = name;
    }
    public void setId(int id) {
        Id = id;
    }
    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "UserBean{" +
                "name='" + name + '\'' +
                ", Id=" + Id +
                ", age=" + age +
                '}';
    }

    @Bean
    public UserBean users(){
        UserBean user=new UserBean();
        user.setName("张三");
        user.setId(01);
        user.setAge(18);
        return user;
    }
}

在测试类中运行:

import model.*;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import javax.jws.soap.SOAPBinding;

public class App {
    public static void main(String[] args) {
        //1.获取上下文对象
      ApplicationContext context=new ClassPathXmlApplicationContext("spring.xml");
      //2.获取spring中存入的bean对象,id默认是类名首字母小写,其余不变
       UserBean user=(UserBean)context.getBean("users");
       //3.调用方法
        System.out.println(user.toString());
    }
}

运行结果如下:

UserBean{name='张三', Id=1, age=18}

注意:Spring在默认情况下是类扫描,如果使用方法注解@Bean,需要搭配类注解@Component或者@Configuration一起使用,否则spring无法扫描到这个方法,就不能将方法返回对象储存到spring中。

重命名
在使用@Bean时,我们可以对方法进行重命名,可以同时为该方法创建多个名字:


    @Bean(name={"u1","us1"})
    public UserBean users(){
        UserBean user=new UserBean();
        user.setName("张三");
        user.setId(01);
        user.setAge(18);
        return user;
    }

当创建了多个名字后,原来的方法名就失效,我们可以使用重命名来获取bean对象。
Spring~用注解储存bean(类注解、方法注解)_第8张图片

你可能感兴趣的:(Spring,spring,java,框架,后端)