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

相关推荐
BillKu1 分钟前
Java + Spring Boot + Mybatis 插入数据后,获取自增 id 的方法
java·tomcat·mybatis
全栈凯哥1 分钟前
Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解
java·算法·leetcode·链表
chxii2 分钟前
12.7Swing控件6 JList
java
全栈凯哥4 分钟前
Java详解LeetCode 热题 100(27):LeetCode 21. 合并两个有序链表(Merge Two Sorted Lists)详解
java·算法·leetcode·链表
YuTaoShao4 分钟前
Java八股文——集合「List篇」
java·开发语言·list
PypYCCcccCc10 分钟前
支付系统架构图
java·网络·金融·系统架构
一叶知秋秋30 分钟前
python学习day39
人工智能·深度学习·学习
华科云商xiao徐31 分钟前
Java HttpClient实现简单网络爬虫
java·爬虫
weixin_4487816239 分钟前
DenseNet算法 实现乳腺癌识别
pytorch·深度学习·神经网络
扎瓦44 分钟前
ThreadLocal 线程变量
java·后端