Spring注解开发-阿里云开发者社区

开发者社区> 兮动人> 正文

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();
    }
}

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
SpringBoot学习笔记-4:第四章 Spring Boot Web 开发
SpringBoot学习笔记-4:第四章 Spring Boot Web 开发
15 0
《Spring Boot开发:从0到1》第12章 Spring Boot与微服务
第12章 Spring Boot与微服务 12.1 微服务架构 微服务架构是将一个系统应用拆分成多个不同的服务,每个服务独立开发、部署、扩展。服务于服务之间通过RESTful API,RPC接口或者其他方式协同工作。
803 0
《Spring Boot开发:从0到1》第11章 Spring Boot应用监控
第11章 Spring Boot Actuator与应用监控 Spring Boot的Actuator 将应用的很多信息暴露出来,如容器中的 bean,自动配置时的决策,运行时健康状态, metrics等等。
891 0
【Spring注解开发】使用@Configuration和@Bean向容器中注册组件?看这一篇就够了!!
在之前的Spring版本中,我们只能通过写XML配置文件来定义我们的Bean,XML配置不仅繁琐,而且很容易出错,稍有不慎就会导致编写的应用程序各种报错,排查半天,发现是XML文件配置不对!另外,每个项目编写大量的XML文件来配置Spring,也大大增加了项目维护的复杂度,往往很多个项目的Spring XML文件的配置大部分是相同的,只有很少量的配置不同,这也造成了配置文件上的冗余。 项目工程源码已经提交到GitHub:https://github.com/sunshinelyz/spring-annotation
5 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
4298 0
《Spring Boot开发:从0到1》全书目录结构
《Spring Boot开发:从0到1》 全书目录结构 第一部分Spring Boot基础 第1章 Spring Boot史前简述 1.1 J2EE(Java 2 Platform Enterprise Edition)简介 1.
2659 0
【Spring注解驱动开发】聊聊Spring注解驱动开发那些事儿!
今天,面了一个工作5年的小伙伴,面试结果不理想啊!也不是我说,工作5年了,问多线程的知识:就只知道继承Thread类和实现Runnable接口!问Java集合,竟然说HashMap是线程安全的!问MySQL的MyISAM存储引擎和InnoDB存储引擎的区别,竟然说成是MyISAM存储引擎支持事务,InnoDB不支持!问Spring就只知道IOC和AOP的概念,深一点就不知道了!再问项目。。。哎,算了,不说了! 大家对于设计模式、高并发和Java8新特性,不了解的,就去看我的专栏吧!今天,我们来聊聊关于Spring注解驱动开发的那些事儿,也算是Spring专栏的开篇吧!
6 0
Spring项目开发过程的几个坑
最近在做一个项目,在使用SSM的过程中有些知识点值得记录,这几个知识点相对来说比较有价值,我想不少人可能会遇到这几个问题。 1、数据库建表的时候,表的字段不能为数据库的关键字.
813 0
+关注
兮动人
世间味趣亦如此,万物且去轮浮生。
120
文章
1
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载