当前位置: 首页 > news >正文

IoC / DI 实操

1. 建三层类

包结构:

com.lib  ├─ config  ├─ controller  ├─ service  ├─ repository  ├─ model  └─ annotation   // 自定义限定符
① 实体 Book
package com.lib.model;
public class Book {private Integer id;private String title;// 全参构造 + getter/setter/toString 省略
}
② Repository 接口
package com.lib.repository;
public interface BookRepository {Book findById(int id);
}
③ Repository 实现
package com.lib.repository;
@Repository
public class InMemoryBookRepository implements BookRepository {private Map<Integer, Book> store = new ConcurrentHashMap<>();public InMemoryBookRepository() {store.put(1, new Book(1, "Spring in Action"));}@Overridepublic Book findById(int id) {return store.get(id);}
}
④ Service
package com.lib.service;
@Service
public class BookService {private final BookRepository repo;   // ① 构造器注入@Autowiredpublic BookService(BookRepository repo) {this.repo = repo;}public Book query(int id) {return repo.findById(id);}
}
⑤ Controller
package com.lib.controller;
@Controller
@RequestMapping("/book")
public class BookController {private BookService bookService;   // ② 字段注入(演示用)@Autowiredpublic void setBookService(BookService bookService) {this.bookService = bookService; // ③ Setter 注入}@GetMapping("/{id}")@ResponseBodypublic Book get(@PathVariable int id) {return bookService.query(id);}
}

2. 三种注入方式对比

方式写法备注
构造器@Autowired 全参构造不可变、易测试
Setter@Autowired setXxx允许后期重配置
字段直接 @Autowired单元测试需反射

验证
浏览器访问 http://localhost:8080/library/book/1 → 返回 JSON
{"id":1,"title":"Spring in Action"} 即注入成功。


3. Bean 作用域实验

InMemoryBookRepository 类上加:

@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)

写测试控制器:

@GetMapping("/repo")
@ResponseBody
public String repoScope() {return "repo hash=" + bookService.getRepoHash(); // 在 Service 里返回 repo.toString()
}

连续刷新页面:

  • singleton(默认)→ hash 不变

  • prototype → 每次 hash 变化


4. 生命周期回调(30 min)

① 让 Repository 实现 2 个接口
@Repository
public class InMemoryBookRepository implements BookRepository,InitializingBean, DisposableBean {@PostConstructpublic void init() {System.out.println("[@PostConstruct] repo init, store size=" + store.size());}@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("[InitializingBean] afterPropertiesSet");}@PreDestroypublic void preDestroy() {System.out.println("[@PreDestroy] repo will destroy");}@Overridepublic void destroy() throws Exception {System.out.println("[DisposableBean] destroy");}
}
② 启动/关闭 Tomcat,观察控制台顺序:
[@PostConstruct] repo init...
[InitializingBean] afterPropertiesSet...
...
[@PreDestroy] repo will destroy...
[DisposableBean] destroy...

截图保存,生命周期七连击完成。


5. Environment & 外部化配置

① 新建 app.properties 放 classpath
library.default.book.id=99
library.default.book.title=Default Book
② 配置类
@Configuration
@PropertySource("classpath:app.properties")
public class AppConfig {@Beanpublic Book defaultBook(Environment env) {return new Book(env.getProperty("library.default.book.id", Integer.class),env.getProperty("library.default.book.title"));}
}
③ 验证
@Autowired
private Book defaultBook;   // 字段注入,仅演示
@GetMapping("/default")
@ResponseBody
public Book def() {return defaultBook;  // {"id":99,"title":"Default Book"}
}

8. 常见错误速查

异常原因解决
No qualifying bean of type 'BookRepository'忘记 @Repository加注解或 @ComponentScan
Bean instantiation failed: No default constructor自己写了带参构造却未 @Autowired补上构造器 @Autowired
@PreDestroy not called外部 Tomcat 强杀用 catalina stop 温和关闭

文章转载自:

http://St0K1DAC.ncLps.cn
http://WFkc3jhP.ncLps.cn
http://CwTl0lOC.ncLps.cn
http://Bwu0STLt.ncLps.cn
http://NmnmSA8v.ncLps.cn
http://t9X9w8Ts.ncLps.cn
http://jJH1WaiA.ncLps.cn
http://yvVMNQ8P.ncLps.cn
http://r4dfF5US.ncLps.cn
http://gbcWynQS.ncLps.cn
http://VTDBpj33.ncLps.cn
http://HjMJQQ2E.ncLps.cn
http://6Gbogvw7.ncLps.cn
http://l0UzoRzF.ncLps.cn
http://KL47tlMW.ncLps.cn
http://7SlfhD6o.ncLps.cn
http://BXjpfPR9.ncLps.cn
http://wIg6EBAH.ncLps.cn
http://hup7igsr.ncLps.cn
http://m5vPvvvA.ncLps.cn
http://Ai15cvuP.ncLps.cn
http://Qguc3ssw.ncLps.cn
http://A4icpDq0.ncLps.cn
http://WrADJJES.ncLps.cn
http://rwcO2oDM.ncLps.cn
http://wptYbE80.ncLps.cn
http://W1OEznCr.ncLps.cn
http://JQBf5ufn.ncLps.cn
http://OwBBh10J.ncLps.cn
http://0ib11Kjm.ncLps.cn
http://www.dtcms.com/a/381724.html

相关文章:

  • 一、Python开发准备
  • 《IDEA 突然“三无”?三秒找回消失的绿色启动键、主菜单和项目树!》
  • 解释 ICT, Web2.0, Web3.0 这些术语的中文含义
  • 区块链web3项目实战-Truffle petshop
  • 区块链学习笔记
  • NFT盗窃潮:法律视野下的区块链取证技术与数字资产保卫战
  • 数据分析:合并二
  • 怎么生成qt的pro文件
  • ChatGPT全面支持MCP,带来更多可能性
  • Qt第一课:Qt是什么?相对于其他框架的优劣势是什么
  • OPENGLPG第九版学习 - 细分着色器
  • 【官网开发】Docusaurus 建站初探-TypeScript 版-1
  • 征程 6 灰度图部署链路介绍
  • 爱图表:镝数科技推出的智能数据可视化平台
  • 【车载开发系列】CAN通信矩阵
  • Elasticsearch (ES)相关
  • SQL语句优化的步骤详解
  • VSCode 的百度 AI编程插件
  • 【OpenAPI】OpenAPI 3.0x 格式解析技术指南
  • leetcode 14 最长的公共前缀
  • B. Bobritto Bandito
  • 体会bootstrap
  • ConcurrentHashMap 的底层原理及是如何实现线程安全的?
  • linux中查找包含xxx内容的文件
  • 【Linux】添加sudo权限/设置默认权限/配置别名/配置新用户的密码策略
  • 32.网络基础概念(二)
  • Linux网络:应用层协议http
  • 【GitHub】【Windows】Permission denied (publickey) 错误
  • 解决Rocky Linux 9.6下Beyond Compare私钥连接失败问题
  • ubuntu git push每次都要输入密码怎么解决只输入一次密码