Spring注解开发

1. 注解开发

上一节带大家了解了Spring的入门,是基于xml配置文件进行配置的,现在通过xml配置文件进行配置的方法已经淘汰了,现在用的比较多的是配置类进行配置。

1.1 导入坐标

java 复制代码
<!--  1.导入 spring-context 坐标  -->
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>6.1.12</version>
        </dependency>
    </dependencies>

1.2 创建接口层、实现类、配置类以及测试类

复制代码
UserDao
java 复制代码
package com.it.dao;

public interface UserDao {
    public void save();

}
复制代码
UserDaoImpl,使用注解,将实现类交给Spring管理
java 复制代码
package com.it.dao.impl;

import com.it.dao.UserDao;
import org.springframework.stereotype.Component;


// 2. 需要被Spring托管的bean,需要添加注解 Component
@Component
public class UserDaoImpl implements UserDao {
    @Override
    public void save() {
        System.out.println("实现UserDao");
    }
}
复制代码
SpringConfig配置类,管理Bean对象
java 复制代码
package com.it.config;

import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

/**
 * 3. 配置类,用于定义Spring的配置信息。
 * 使用@ComponentScan启用组件扫描,自动注册Bean。
 */
@Configuration // 标记为Spring的配置类
@ComponentScan("com.it") // 指定需要扫描的包路径
public class SpringConfig {
}

1.3 进行测试

java 复制代码
package com.it;

import com.it.config.SpringConfig;
import com.it.dao.UserDao;
import com.it.dao.impl.UserDaoImpl;
import com.it.service.impl.UserServiceImpl;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Test {
    public static void main(String[] args) {
//        创建Spring IoC容器,并加载配置类SpringConfig
        AnnotationConfigApplicationContext ioc =
                new AnnotationConfigApplicationContext(SpringConfig.class);
        // 从Spring IoC容器中获取UserDaoImpl的Bean实例
        UserDaoImpl userDao = ioc.getBean(UserDaoImpl.class);
        userDao.save();

    }
}

再创建其他业务层道理是同样的,如果有一个service层,想要实现dao层的方法,该怎么实现呢?按照之前的逻辑需要在Service实现类中调用dao,如下

java 复制代码
package com.it.service;

public interface UserService {
    public void save2();
}
java 复制代码
package com.it.service.impl;

import com.it.dao.UserDao;
import com.it.service.UserService;
import org.springframework.stereotype.Component;

@Component
public class UserServiceImpl implements UserService {

    private UserDao userDao;

    @Override
    public void save2() {
        System.out.println("实现UserService");
        userDao.save();
    }
}
java 复制代码
package com.it;

import com.it.config.SpringConfig;
import com.it.dao.UserDao;
import com.it.dao.impl.UserDaoImpl;
import com.it.service.impl.UserServiceImpl;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Test {
    public static void main(String[] args) {
//        创建Spring IoC容器,并加载配置类SpringConfig
        AnnotationConfigApplicationContext ioc =
                new AnnotationConfigApplicationContext(SpringConfig.class);
        // 从Spring IoC容器中获取UserDaoImpl的Bean实例
        UserDaoImpl userDao = ioc.getBean(UserDaoImpl.class);
        userDao.save();

        UserServiceImpl userService = ioc.getBean(UserServiceImpl.class);
        userService.save2();
    }
}

但是这样会发现控制台会报一个空指针异常,是因为我们没有实例化对象

遇到事情不要慌~,只需要一个注解就可以完成实例化,即 @Autowired 注解

2. Bean配置

在注解开发中,bean配置的作用范围也是通过注解实现的,注解为@Scope,有两个比较常见的模式:

  • 单例模式 singleton(默认)
  • 非单例模式 prototype

2.1 单例模式 singleton

java 复制代码
package com.it.dao.impl;

import com.it.dao.UserDao;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;


// 2. 需要被Spring托管的bean,需要添加注解 Component
@Component
// @Scope("singleton") 表示该Bean在Spring容器中以单例模式存在,整个应用中共享一个实例,容器中只有一个对象
// @Scope("prototype") 表示每次请求该Bean时都会创建一个新的实例 每次用都会进行创建
@Scope("singleton")
public class UserDaoImpl implements UserDao {
    @Override
    public void save() {
        System.out.println("实现UserDao");
    }
}

2.2 非单例模式 prototype

java 复制代码
package com.it.dao.impl;

import com.it.dao.UserDao;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;


// 2. 需要被Spring托管的bean,需要添加注解 Component
@Component
// @Scope("singleton") 表示该Bean在Spring容器中以单例模式存在,整个应用中共享一个实例,容器中只有一个对象
// @Scope("prototype") 表示每次请求该Bean时都会创建一个新的实例 每次用都会进行创建
@Scope("prototype")
public class UserDaoImpl implements UserDao {
    @Override
    public void save() {
        System.out.println("实现UserDao");
    }
}

可以看到每创建一个对象,都是一个新的

3. Bean实例化

Bean对象的创建方式有三种:

  • 构造方法方式(默认)

当该类被Spring容器实例化时会调用构造方法

java 复制代码
package com.it.dao.impl;

import com.it.dao.UserDao;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;


// 2. 需要被Spring托管的bean,需要添加注解 Component
@Component
// @Scope("singleton") 表示该Bean在Spring容器中以单例模式存在,整个应用中共享一个实例,容器中只有一个对象
// @Scope("prototype") 表示每次请求该Bean时都会创建一个新的实例 每次用都会进行创建
@Scope("prototype")
public class UserDaoImpl implements UserDao {
//
    /**
     * 构造方法,用于创建UserDaoImpl实例
     * 当该类被Spring容器实例化时会调用此构造方法
     */
    public UserDaoImpl() {
        System.out.println("UserDaoImpl被创建了");
    }

    @Override
    public void save() {
        System.out.println("实现UserDao");
    }
}
  • 静态工厂方式(使用场景不多)

1. 创建实体类

java 复制代码
package com.it.pojo;

public class Students {
    private String name;
    
}

2. 实例化

java 复制代码
package com.it.dao.impl;


import com.it.pojo.Students;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;

@Component
public class StudentsDaoImpl {

    /**
     * 使用Spring的@Bean注解标识此方法将返回一个被Spring管理的Bean实例。
     * 此方法是一个静态工厂方法,用于创建并返回一个Students实例。
     * @return 一个新的Students对象实例
     */
    @Bean
    public static Students getStudents() {
        System.out.println("静态工厂实例化");
        return new Students();
    }
}

3. 测试

  • 实例工厂方式

实例工厂方式是用的最多的,常用来整合其他第三方技术

4. Bean生命周期

4.1 导入生命周期依赖坐标

java 复制代码
<dependency>
            <groupId>javax.activation</groupId>
            <artifactId>javax.activation-api</artifactId>
            <version>1.2.0</version>
        </dependency>

4.2 Bean生命周期配置

  • init-method:指定初始化方法名称
  • destroy-method:指定销毁方法名称

5. Bean扫描注解

Spring框架中提供了详细扫描注解,规范开发,控制层有@Controller,业务层有@Service,持久层(实现类)有@Repository,将上面的案例代码修改如下

5.1 注解@Autowired作用

@Autowired 是一个注释,它可以对类成员变量、方法及构造函数进行标注,让 spring 完成 bean 自动装配的工作。

@Autowired 默认是按照类去匹配,配合 @Qualifier 指定按照名称去装配 bean

相关推荐
DCTANT12 分钟前
【原创】国产化适配-全量迁移MySQL数据到OpenGauss数据库
java·数据库·spring boot·mysql·opengauss
Touper.21 分钟前
SpringBoot -- 自动配置原理
java·spring boot·后端
黄雪超31 分钟前
JVM——函数式语法糖:如何使用Function、Stream来编写函数式程序?
java·开发语言·jvm
ThetaarSofVenice37 分钟前
对象的finalization机制Test
java·开发语言·jvm
张较瘦_1 小时前
[论文阅读] 人工智能 | 深度学习系统崩溃恢复新方案:DaiFu框架的原位修复技术
论文阅读·人工智能·深度学习
cver1231 小时前
野生动物检测数据集介绍-5,138张图片 野生动物保护监测 智能狩猎相机系统 生态研究与调查
人工智能·pytorch·深度学习·目标检测·计算机视觉·目标跟踪
学技术的大胜嗷1 小时前
离线迁移 Conda 环境到 Windows 服务器:用 conda-pack 摆脱硬路径限制
人工智能·深度学习·yolo·目标检测·机器学习
一只叫煤球的猫2 小时前
手撕@Transactional!别再问事务为什么失效了!Spring-tx源码全面解析!
后端·spring·面试
望获linux2 小时前
【实时Linux实战系列】CPU 隔离与屏蔽技术
java·linux·运维·服务器·操作系统·开源软件·嵌入式软件
JosieBook2 小时前
【Java编程动手学】使用IDEA创建第一个HelloJava程序
java·开发语言·intellij-idea