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

最新文章

  1. 玩儿转物联网IoT - 在Beagle Bone Black上运行node.js 程序
  2. jQuery习题的一些总结
  3. mysql的password()函数和md5函数
  4. [51 nod]1009 数字1的数量
  5. HDU 4911 Inversion (逆序数 归并排序)
  6. ISBN
  7. redhat mysql 远程开启
  8. windows内核初窥(二)-----系统机制
  9. sublime text3的一些小技巧记录(配gif图)
  10. 前端自动化构建工具 Gulp 使用
  11. moveToThread的最简单用法(依葫芦画瓢即可)(使得线程也更偏向于信号槽的使用方法)
  12. otool是mac自带的工具
  13. Windows,Mac与Linux哪个更适合开发者?
  14. jmeter 使用白皮书
  15. openvpn 初步使用
  16. Python—字典的操作
  17. yarn虚拟cpu和虚拟内存
  18. Java和Python安装和编译器使用
  19. python基础之import模块导入和包的调用
  20. 单点登录(SSO)问题

热门文章

  1. SpringMVC form 表单提交报400错误
  2. Vue教程:windows下安装npm和cnpm
  3. 用fullPage来实现全屏滚动效果
  4. [日常] Apache Order Deny,Allow的用法
  5. 【转】详解spring 每个jar的作用
  6. mybatis之Sql语句构建器
  7. 使用mac下Fiddler的替代工具Charles进行手机抓包
  8. 动态计算area位置
  9. elastic job will never fire
  10. sql语句执行出错:Incorrect integer value: &#39;&#39; for column &#39;id&#39; at row 1