Spring核心注解详解(二)

1、@Autowired

此注解
是 Spring Framework 中用于自动装配(注入)依赖关系的注解。通过 @Autowired,Spring 将会在运行时自动在容器中查找匹配类型的 Bean,并将其注入到标有 @Autowired 注解的字段、方法参数、构造函数等地方。

基本用法:

@Service
public class MyService {
    @Autowired
    private MyRepository myRepository;
    // 其他方法
}

在上述例子中,MyService 类中的 myRepository 字段被标注为 @Autowired,表示 Spring 将自动注入一个匹配类型的 MyRepository Bean。

构造函数注入:

@Service
public class MyService {

    private final MyRepository myRepository;

    @Autowired
    public MyService(MyRepository myRepository) {
        this.myRepository = myRepository;
    }

    // 其他方法
}

在上述例子中,通过构造函数注入,MyService 类的构造函数上标注了 @Autowired,并接收一个 MyRepository 类型的参数,Spring 将在运行时注入合适的 MyRepository Bean。

方法参数注入:

@Service
public class MyService {

    @Autowired
    public void setMyRepository(MyRepository myRepository) {
        // 在方法中使用注入的myRepository
    }

    // 其他方法
}

在上述例子中,通过方法参数注入,setMyRepository 方法的参数上标注了 @Autowired,表示 Spring 将在运行时注入合适的 MyRepository Bean。

多个 Bean 的注入:

@Service
public class MyService {

    @Autowired
    private List<MyRepository> myRepositories;

    // 其他方法
}

在上述例子中,myRepositories 字段是一个 List 类型,Spring 将注入所有匹配类型的 MyRepository Bean,并以列表形式注入。

@Autowired 的 required 属性:

@Service
public class MyService {

    @Autowired(required = false)
    private MyRepository myRepository;

    // 其他方法
}

在上述例子中,通过 required = false 属性,表示 myRepository 字段是可选的,如果找不到匹配的 Bean,Spring 不会抛出异常。

构造函数注入的优势:

构造函数注入能够确保依赖关系在对象创建时就被注入,避免了在对象的生命周期内发生变化。

构造函数注入能够使对象的状态在创建后是不可变的,有助于创建更加健壮和可维护的代码。

构造函数注入有助于清晰地表达对象之间的依赖关系,使得代码更易读。

注意事项:

@Autowired 注解通常用在字段、构造函数、方法参数等位置,用于声明要进行自动注入的依赖关系。

@Autowired 可以配合其他注解使用,例如与 @Qualifier 一起使用以指定具体要注入的 Bean。
@Service
public class MyService {

    @Autowired
    @Qualifier("myRepositoryImpl")
    private MyRepository myRepository;

    // 其他方法
}
在 Spring 4.3 之后,@Autowired 注解也可以用在方法上,用于方法参数的注入。
@Service
public class MyService {

    private MyRepository myRepository;

    @Autowired
    public void setMyRepository(MyRepository myRepository) {
        this.myRepository = myRepository;
    }

    // 其他方法
}
在 Spring Boot 应用中,通常不需要显式配置 @Autowired,因为 Spring Boot 提供了自动装配的功能,会自动注入符合条件的 Bean。

2、@Component

此注解是 Spring Framework 中最基本的注解之一,用于标识一个类为 Spring 管理的组件(Bean)。被 @Component 注解标记的类将由 Spring 自动扫描,并注册为 Spring 容器中的一个 Bean。

基本用法:

@Component
public class MyComponent {
    // 类的实现
}

在上述例子中,MyComponent 类被标注为 @Component,表示它是一个由 Spring 管理的组件,将会被自动注册为 Spring 容器中的 Bean。

指定 Bean 的名称:

@Component("myBean")
public class MyComponent {
    // 类的实现
}

在上述例子中,@Component(“myBean”) 指定了 Bean 的名称为 “myBean”。如果不指定名称,默认的 Bean 名称将会是类名的首字母小写,即 “myComponent”。

配合自动扫描使用:

@Configuration
@ComponentScan("com.example")
public class AppConfig {
    // 其他配置
}

在上述例子中,@ComponentScan(“com.example”) 表示 Spring 将扫描 com.example 包及其子包中的所有组件,并将它们注册为 Spring 容器中的 Bean。

不同的组件注解:

除了 @Component,Spring Framework 还提供了一系列衍生注解,用于表示不同类型的组件,如下所示:

@Repository: 用于标识数据访问组件,通常与数据库交互。
@Service: 用于标识服务层组件,通常包含业务逻辑。
@Controller: 用于标识控制器组件,通常处理用户请求,返回视图或数据。

这些注解的作用是一样的,都用于标识组件,只是在语义上有所区别,有助于更好地组织代码。

注意事项:

@Component 注解通常用在类级别上,用于标识一个类为 Spring 管理的组件。

被 @Component 注解标记的类将被 Spring 自动扫描,可以通过 @ComponentScan 注解指定扫描的包路径。

Spring Boot 应用中,通常不需要显式配置 @ComponentScan,因为 Spring Boot 默认会扫描主应用类所在的包及其子包。

在被标注为 @Component 的类中,可以使用 @Autowired 注解进行依赖注入。
@Component
public class MyComponent {

    @Autowired
    private AnotherComponent anotherComponent;

    // 其他实现
}

3、@Controller

此注解是 Spring Framework 中用于标识控制器组件的注解。被 @Controller 注解标记的类通常用于处理用户请求,协调业务逻辑,并返回视图或数据。

基本用法:

@Controller
public class MyController {

    @RequestMapping("/hello")
    public String sayHello() {
        return "hello"; // 返回视图名
    }
}

在上述例子中,MyController 类被标注为 @Controller,并通过 @RequestMapping(“/hello”) 注解指定了处理请求的路径。sayHello 方法返回字符串 “hello”,表示将渲染名为 “hello” 的视图。

配合视图解析器使用:

@Configuration
public class AppConfig implements WebMvcConfigurer {

    @Bean
    public ViewResolver viewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        return resolver;
    }
}

在上述例子中,通过 InternalResourceViewResolver 配置了一个 JSP 视图解析器,指定了视图的前缀和后缀。这样,返回 “hello” 的方法将渲染 /WEB-INF/views/hello.jsp 视图。

接收请求参数:

@Controller
public class MyController {

    @RequestMapping("/greet")
    public String greet(@RequestParam(name = "name", defaultValue = "Guest") String name, Model model) {
        model.addAttribute("name", name);
        return "greet"; // 返回视图名
    }
}

在上述例子中,greet 方法通过 @RequestParam 注解接收名为 “name” 的请求参数,并将其传递给视图。在视图中,可以通过 ${name} 获取该值。

重定向和转发:

@Controller
public class MyController {

    @RequestMapping("/redirect")
    public String redirectToHello() {
        return "redirect:/hello";
    }

    @RequestMapping("/forward")
    public String forwardToGreet() {
        return "forward:/greet";
    }
}

在上述例子中,redirectToHello 方法通过 return “redirect:/hello” 实现重定向,将请求重定向到 “/hello” 路径。而 forwardToGreet 方法通过 return “forward:/greet” 实现转发,将请求转发到 “/greet” 路径。

注意事项:

@Controller 注解通常用在类级别上,用于标识一个类为 Spring 管理的控制器组件。

被 @Controller 注解标记的类通常包含处理请求的方法,这些方法通过 @RequestMapping 注解指定处理的路径。

控制器方法可以接收请求参数,可以通过 @RequestParam 注解进行标注。

控制器方法通常返回视图名,Spring 将使用视图解析器解析视图名,并渲染相应的视图。

@Controller 通常与 @RequestMapping 一起使用,@RequestMapping 可以用在类级别上指定基础路径,也可以用在方法级别上指定具体的请求路径。

控制器方法可以返回字符串、ModelAndView、Model、Map 等,用于表示要渲染的视图以及传递给视图的数据。

4、@Service

此注解是 Spring Framework 中用于标识服务层组件的注解。被 @Service 注解标记的类通常包含业务逻辑,提供服务层的功能,并被设计为在应用程序中复用的服务组件。

基本用法:

@Service
public class MyService {

    public String performService() {
        // 服务层的业务逻辑
        return "Service performed successfully";
    }
}

在上述例子中,MyService 类被标注为 @Service,表示它是一个由 Spring 管理的服务组件。通常,@Service 注解用在服务层的类上,用于标识提供业务逻辑的服务组件。

与@Controller的配合:

@Service
public class MyService {

    public String performService() {
        // 服务层的业务逻辑
        return "Service performed successfully";
    }
}
@Controller
public class MyController {

    @Autowired
    private MyService myService;

    @RequestMapping("/useService")
    public String useService() {
        String result = myService.performService();
        // 控制器的业务逻辑
        return "resultPage";
    }
}

在上述例子中,MyController 类中通过 @Autowired 注解将 MyService 注入进来,从而可以在控制器中调用服务层的方法。这种方式实现了服务层和控制器的解耦,使得业务逻辑更容易维护和测试。

注意事项:

@Service 注解通常用在类级别上,用于标识一个类为 Spring 管理的服务组件。

被 @Service 注解标记的类通常包含业务逻辑,提供服务层的功能,但不处理 HTTP 请求或返回视图。

服务层的方法通常用于执行业务逻辑,可能与数据库交互、调用其他服务、执行计算等。

被 @Service 注解标记的类会被 Spring 自动扫描并注册为 Spring 容器中的 Bean。

服务层的组件可以通过 @Autowired 注解来注入其他 Spring 托管的 Bean,如 DAO 层组件、其他服务层组件等。
@Service
public class MyService {

    @Autowired
    private MyRepository myRepository;

    // 服务层的业务逻辑
}

5、@Repository

此注解是 Spring Framework 中用于标识数据访问组件(DAO,Data Access Object)的注解。被 @Repository 注解标记的类通常用于与数据库进行交互,执行数据访问操作,并将数据访问的异常转换为 Spring 的 DataAccessException。

基本用法:

@Repository
public class MyRepository {

    public String fetchData() {
        // 从数据库中获取数据的业务逻辑
        return "Data from the database";
    }
}

在上述例子中,MyRepository 类被标注为 @Repository,表示它是一个由 Spring 管理的数据访问组件。通常,@Repository 注解用在与数据库交互的 DAO 类上,用于标识提供数据访问功能的组件。

与@Service和@Controller的配合:

@Repository
public class MyRepository {

    public String fetchData() {
        // 从数据库中获取数据的业务逻辑
        return "Data from the database";
    }
}
@Service
public class MyService {

    @Autowired
    private MyRepository myRepository;

    public String performService() {
        String data = myRepository.fetchData();
        // 服务层的业务逻辑
        return "Service performed with data: " + data;
    }
}
@Controller
public class MyController {

    @Autowired
    private MyService myService;

    @RequestMapping("/useService")
    public String useService() {
        String result = myService.performService();
        // 控制器的业务逻辑
        return "resultPage";
    }
}

在上述例子中,MyService 类中通过 @Autowired 注解将 MyRepository 注入进来,从而可以在服务层中调用数据访问层的方法。这种方式实现了服务层和控制器与数据访问层的解耦,使得业务逻辑更容易维护和测试。

注意事项:

@Repository 注解通常用在类级别上,用于标识一个类为 Spring 管理的数据访问组件。

被 @Repository 注解标记的类通常包含数据访问的业务逻辑,执行数据库查询、更新等操作。

数据访问组件可以通过 @Autowired 注解来注入其他 Spring 托管的 Bean,如 JdbcTemplate、其他数据访问组件等。
@Repository
public class MyRepository {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    // 数据访问的业务逻辑
}
被 @Repository 注解标记的类会被 Spring 自动扫描并注册为 Spring 容器中的 Bean。

@Repository 注解通常与 @Service、@Controller 一起使用,构成整个应用程序的层次结构,其中 @Service 负责业务逻辑,@Repository 负责数据访问,@Controller 负责处理用户请求。
  • 27
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

户伟伟

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

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

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

打赏作者

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

抵扣说明:

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

余额充值