Spring 框架的实现依赖 IoC (反向控制) 原则,更为形象的称呼是 DI (依赖注入)。相对于 Bean 直接构造依赖的对象,Spring 框架则根据 Bean之间的依赖关系创建对象,并注入到 Bean 中。

public UserServiceImpl implements UserService {
private CreditUserService creditUserService = new CreditUserService();
public void order(...) {
...
creditUserService.addCredit(4);
}
}

对于上述代码,creditUserService 实例是在 UserService 对象中创建的,创建方式比较简单,调用了构造函数。如果 creditUserService 本身构造方式比较复杂,而且是个单例对象,那么会使用工厂类来实现进一步优化。

private CreditUserService creditUserService = CreditUserServiceFactory.getService();

在 Spring 框架中,如果你的 Bean 是通过 Spring 来管理的,Spring 容器则会帮你完成这些事情,开发人员需要做的仅仅是声明依赖关系。

@Service
public CrediUserServiceImpl implements CreditUserService {
public void addCredit(int score) { }
} @Service
public UserService {
@Autowired
private CreditUserService creditUserService;
public void order(...) {
...
creditUserService.addCredit(4);
}
}

Bean 通过注解 @Service 声明为一个 Spring 管理的 Bean, Spring 容器会扫名 classpath 下的所有类,找到带有 @Service 注解的 UserService 类,并根据 Spring 注解对其进行初始化和增强,如果发现此类属性 creditUserService 也有 @Autowired,则会从 Spring 容器里找一个已经初始化好的 CreditUserService ,如果没有,则先初始化。

如何成为一个 Spring 容器管理的 Bean ? 在 Spring Boot 中依靠注解,如在类上的注解 @Controller, @Service, @Configuration 等,方法上的注解 @Bean。

Spring 常用注解

Spring 提供了多个注解声明 Bean 为 Spring 管理的 Bean,注解不同代表的含义不一样,但对于 Spring 容器来说,都是 Spring 管理的 Bean。

  • Controller: 声明此类是一个 MVC 类, 通常与 @RequestMapping 一起使用。
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/get/{id}")
public String getUser(@PathVariable String id) { }
}
  • Service: 声明此类是一个业务处理类,通常与 @Transactional 一起配合使用
@Service
@Transactional
public Class UserServiceImpl implements UserService {
public void order(...) { }
}
  • Repository: 声明此类是一个数据库或者其他NoSQL访问类。
@Repository
public class UserDao implements CrudDao<User,String> { }
  • RestController 同Controller 用于REST服务
  • Component 声明此类是一个 Spring 管理的类,通常用于无法用上述注解描述的Spring管理类
  • Configuration 声明此类是一个配置类,通常与注解 @Bean配合使用。
@Configuration
public class DataSourceConfig {
@Bean(name = "dataSource")
public DataSource datasource(Environment env) {
HikariDataSource ds = new HikariDataSource();
ds.setJdbcUrl(env.getProperty("spring.datasource.url"));
ds.setUsername(env.getProperty("spring.datasource.username"));
ds.setPassword(env.getProperty("spring.datasource.password"));
return ds;
}
}

如上,DataSourceConfig 是一个 Spring 容器配置类,配置了 HikariDataSource

Spring 容器介绍的更多相关文章

  1. Spring容器技术内幕之BeanWrapper类介绍

    引言 org.springframework.beans.BeanWrapper是Spring框架中重要的组件类.BeanWrapper相当于一个代理器,Spring委托BeanWrapperwanc ...

  2. Spring容器技术内幕之BeanDefinition类介绍

    引言 org.springframework.beans.factory.config.BeanDefinition是配置文件< bean >元素标签在容器中地内部表示.< bean ...

  3. Spring容器的refresh()介绍

    Spring容器的refresh()[创建刷新]; 1.prepareRefresh()刷新前的预处理; 1).initPropertySources()初始化一些属性设置;子类自定义个性化的属性设置 ...

  4. [翻译]Spring框架参考文档(V4.3.3)-第二章Spring框架介绍 2.1 2.2 翻译--2.3待继续

    英文链接:http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/overview.ht ...

  5. Spring 读书笔记-----使用Spring容器(一)

    pring有两个核心接口:BeanFactory和ApplicationContext,其中ApplicationContext是BeanFactory的子接口.他们都可代表Spring容器,Spri ...

  6. Spring读书笔记-----使用Spring容器(二)

    一.使用ApplicationContext 前面介绍了,我们一般不会使用BeanFactory实例作为Spring容器,而是使用ApplicationContext实例作为容器,它增强了BeanFa ...

  7. 在listener或者工具中使用spring容器中的bean实例

    在项目中经常遇见需要在Listener中或者工具中使用Spring容器中的bean实例,由于bean不能在stataic的类中使用. 介绍一种方式: public class SpringTool { ...

  8. Spring框架:Spring容器具体解释

    Spring容器 Spring容器能够帮助你管理所有的Bean对象.专业术语称之为IoC控制反转.在传统的程序中.对象的生成都是由开发人员完毕的.而在控制反转中,对象的生成所有都交给框架完毕.这种优点 ...

  9. (转)Spring读书笔记-----使用Spring容器(二)

    一.使用ApplicationContext 前面介绍了,我们一般不会使用BeanFactory实例作为Spring容器,而是使用ApplicationContext实例作为容器,它增强了BeanFa ...

随机推荐

  1. [转]微信小程序之购物车功能

    本文转自:https://www.cnblogs.com/linxin/p/6834206.html 前言 以往的购物车,基本都是通过大量的 DOM 操作来实现.微信小程序其实跟 vue.js 的用法 ...

  2. DotNetBar 使用笔记

    1.删除表格的某一行数据,必须是VirtualMode  = false 的时候才生效,不然就只是灰色 SuperDBG_Right.PrimaryGrid.SetDeletedRows(SuperD ...

  3. 如何优雅的爬取 gzip 格式的页面并保存在本地(java实现)

    1. 引言 在爬取汽车销量数据时需要爬取 html 保存在本地后再做分析,由于一些页面的 gzip 编码格式, 获取后要先解压缩,否则看到的是一片乱码.在网络上仔细搜索了下,终于在这里找到了一个优雅的 ...

  4. spring boot入门笔记(四) - 多环境配置、加载顺序、静态资源映射

    1.多环境配置 先描述下以前的开发流程:从SVN把项目下载到本地,各种修改配置文件,启动成功:完成功能后上传到公司的测试服务器,修改各种配置文件,启动成功:最后到上线的日子里,把新功能中涉及到的文件打 ...

  5. hdu2036(多边形面积)

    Description “ 改革春风吹满地, 不会AC没关系; 实在不行回老家, 还有一亩三分地. 谢谢!(乐队奏乐)” 话说部分学生心态极好,每天就知道游戏,这次考试如此简单的题目,也是云里雾里,而 ...

  6. C Traps:运算

    位移 如果sizeof(int) = 4,那么下面的代码的结果是什么? int x=255; printf("%d", x>>34); 实际输出:63 在编译这个代码时 ...

  7. p2p登录拦截

    1.编写拦截标签 package com.xmg.p2p.base.util; import java.lang.annotation.ElementType; import java.lang.an ...

  8. Pig安装与应用

    1.  参考说明 参考文档: http://pig.apache.org/docs/r0.17.0/start.html#build 2.  安装环境说明 2.1.  环境说明 CentOS7.4+ ...

  9. Java实验案例(接口)

    实验任务 任务一:设计实现发声接口 任务二:动物乐园 实验内容 任务一:设计实现发声接口 任务目的: 理解并掌握如何定义接口 掌握接口的实现方式 任务描述: 设计和实现一个Soundable接口,该接 ...

  10. 2017 先知创新大会:有 ZHI 而来

    先知创新大会( XIANZHI INNOVATION CONFERENCE ) 是聚焦安全行业创新的行业盛事, 旨在推动安全技术的进步和发展. 先知大会的主题是“极致·眼界·创新” 极致:追求技术的极 ...