Spring注解开发

简介: Spring注解开发

1. Spring原始注解

  • Spring是轻代码而重配置的框架,配置比较繁重,影响开发效率,所以注解开发是一种趋势,注解代替xml配置文件可以简化配置,提高开发效率。
  • Spring原始注解主要是替代<Bean>的配置

在这里插入图片描述

  • 注意:

使用注解进行开发时,需要在applicationContext.xml中配置组件扫描,作用是指定哪个包及其子包下的Bean需要进行扫描以便识别使用注解配置的类、字段和方法。

<!--注解的组件扫描-->
<context:component-scan base-package="com.xdr630"></context:component-scan>

2. xml 方式配置实现

userDao

public interface UserDao {
    public void save();
}

userDaoImpl

public class UserDaoImpl implements UserDao {
    @Override
    public void save() {
        System.out.println("save running...");
    }
}

userService

public interface UserService {
    public void save();
}

userServiceImpl

public class UserServiceImpl implements UserService {

    private UserDao userDao;

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }

    @Override
    public void save() {
        userDao.save();
    }
}

applicationContext.xml

<bean id="userDao" class="com.xdr630.dao.impl.UserDaoImpl"></bean>

<bean id="userService" class="com.xdr630.service.impl.UserServiceImpl">
    <property name="userDao" ref="userDao"/>
</bean>

UserController

public class UserController {
    public static void main(String[] args) {
        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserService userService = app.getBean(UserService.class);
        userService.save();
    }
}

在这里插入图片描述

3. 注解配置方式实现

  • 在 UserDaoImpl 下的注解,@Component("userDao") 来替代 下面 bean 的配置
<bean id="userDao" class="com.xdr630.dao.impl.UserDaoImpl"></bean>
@Component("userDao")

在这里插入图片描述

  • userServiceImpl 下
<bean id="userService" class="com.xdr630.service.impl.UserServiceImpl">
    <property name="userDao" ref="userDao"/>
</bean>

在这里插入图片描述

  • 在 applicationContext.xml 下配置组件要扫描的包
<context:component-scan base-package="com.xdr630"></context:component-scan>
  • 测试:

在这里插入图片描述
在这里插入图片描述

  • xml配置和注解配置达到相同的效果
  • 使用 @Component 注解不能马上意识到是哪一层,所以Spring衍生了三个注解:@Repository、@Service、@Controller ,效果和@Component效果是一样的,可读性好点。

在这里插入图片描述
在这里插入图片描述

  • 注意:使用注解方式时,可以省略 set 方法。如:把 userServiceImpl 中的 set 方法删掉,也能成功运行:

在这里插入图片描述

  • 因为把注解放在属性上,直接通过反射为属性赋值,下面的方法也可以使用被赋值的属性了

在这里插入图片描述

  • 但如果使用 xml 配置的时候 set 方法是不能省略的
  • 把上面的 @Qualifier("userDao") 注释掉,也能成功运行,直接写@Autowired也能注入。因为@Autowired 是按照数据类型从Spring容器中进行匹配的,当Spring扫描到这个注解之后,它会直接从Spring容器当中找一个 userDao 类型的 bean,找到之后直接注入。如果容器中 UserDao 类型有多个bean,就不能这样写了 。
  • 按照类型注入,@Autowired
  • 按照名称注入,@Autowired 和 @Qualifier 要一起使用

在这里插入图片描述

  • @Resources 相当于@Autowired 和 @Qualifier

在这里插入图片描述

  • @Value 注入普通数据类型,如:把 hello 注入给 driver

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 使用@Value进行字符串的注入

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 使用@Scope标注Bean的范围

在这里插入图片描述

  • 使用@PostConstruct标注初始化方法,使用@PreDestroy标注销毁方法

在这里插入图片描述
在这里插入图片描述

  • 这里没打印销毁的方法原因是:因为容器还没有关闭程序就执行完了,所以造成销毁的方法还没打印出来
  • 手动关闭就可以看到销毁的方法打印了

在这里插入图片描述
在这里插入图片描述

4. Spring新注解

使用上面的注解还不能全部替代xml配置文件,还需要使用注解替代的配置如下:

  • 非自定义的Bean的配置:<bean>
  • 加载properties文件的配置:<context:property-placeholder>
  • 组件扫描的配置:<context:component-scan>
  • 引入其他文件:<import>

在这里插入图片描述

  • 下面是实现下使用注解完全替代 xml 文件配置

在这里插入图片描述

  • 新建一个核心配置类:SpringConfiguration,相当于总配置
//标志改类是Spring核心配置类
@Configuration
//<context:component-scan base-package="com.xdr630"></context:component-scan>
@ComponentScan("com.xdr630")
//<import resource="xxx"/>
@Import({DataSourceConfiguration.class})
public class SpringConfiguration {
    
}
  • @Import({DataSourceConfiguration.class}) 里面的值其实是一个数组,可以加载多个类,如:
@Import({DataSourceConfiguration.class,xxx.class})
  • 新建数据源配置类:DataSourceConfiguration,相当于分配置
//<context:property-placeholder location="classpath:jdbc.properties"/>
@PropertySource("classpath:jdbc.properties")
public class DataSourceConfiguration {

    @Value("${jdbc.driver}")
    private String driver;

    @Value("${jdbc.url}")
    private String url;

    @Value("${jdbc.username}")
    private String username;

    @Value("${jdbc.password}")
    private String password;

    @Bean("dataSource") //Spring会将当前方法的返回值以指定名称存到Spring容器当中
    public DataSource getDataSource() throws PropertyVetoException {
        ComboPooledDataSource dataSource = new ComboPooledDataSource();
        dataSource.setDriverClass(driver);
        dataSource.setJdbcUrl(url);
        dataSource.setUser(username);
        dataSource.setPassword(password);
        return dataSource;
    }

}
  • 测试加载核心配置类创建Spring容器
public class UserController {
    public static void main(String[] args) {
        //ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
        ApplicationContext app = new AnnotationConfigApplicationContext(SpringConfiguration.class);
        UserService userService = app.getBean(UserService.class);
        userService.save();
    }
}

在这里插入图片描述
在这里插入图片描述

目录
相关文章
|
8天前
|
XML Java 数据格式
SpringBoot入门(8) - 开发中还有哪些常用注解
SpringBoot入门(8) - 开发中还有哪些常用注解
26 0
|
26天前
|
Java Spring
在使用Spring的`@Value`注解注入属性值时,有一些特殊字符需要注意
【10月更文挑战第9天】在使用Spring的`@Value`注解注入属性值时,需注意一些特殊字符的正确处理方法,包括空格、引号、反斜杠、新行、制表符、逗号、大括号、$、百分号及其他特殊字符。通过适当包裹或转义,确保这些字符能被正确解析和注入。
|
1月前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
42 4
|
15天前
|
XML JSON Java
SpringBoot必须掌握的常用注解!
SpringBoot必须掌握的常用注解!
41 4
SpringBoot必须掌握的常用注解!
|
5天前
|
存储 运维 安全
Spring运维之boot项目多环境(yaml 多文件 proerties)及分组管理与开发控制
通过以上措施,可以保证Spring Boot项目的配置管理在专业水准上,并且易于维护和管理,符合搜索引擎收录标准。
17 2
|
1月前
|
XML Java 数据格式
Spring从入门到入土(bean的一些子标签及注解的使用)
本文详细介绍了Spring框架中Bean的创建和使用,包括使用XML配置文件中的标签和注解来创建和管理Bean,以及如何通过构造器、Setter方法和属性注入来配置Bean。
66 9
Spring从入门到入土(bean的一些子标签及注解的使用)
|
17天前
|
存储 缓存 Java
Spring缓存注解【@Cacheable、@CachePut、@CacheEvict、@Caching、@CacheConfig】使用及注意事项
Spring缓存注解【@Cacheable、@CachePut、@CacheEvict、@Caching、@CacheConfig】使用及注意事项
58 2
|
17天前
|
JSON Java 数据库
SpringBoot项目使用AOP及自定义注解保存操作日志
SpringBoot项目使用AOP及自定义注解保存操作日志
33 1
|
26天前
|
XML Java 数据格式
提升效率!Spring Boot 开发中的常见失误轻松规避
本文深入探讨了在 Spring Boot 开发中常见的失误,包括不当使用注解、不良异常处理、低效日志记录等,提供了有效的规避策略,帮助开发者提升代码质量和系统性能,构建更健壮、高效的应用程序。
|
10天前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
23 0