Spring的基础

发布时间:2026/10/20 1:50:44
Spring的基础 IoC控制反转控制是谁来创建对象谁来决定对象之间的依赖关系反转是把这个控制权交给Spring没IoC的时候自己要new对象publicclassUserService{// 你自己手动创建 UserDaoprivateUserDaouserDaonewUserDao();// 你来new你来控制publicvoidsave(){userDao.save();}}有IoC的时候无需自己newpublicclassUserService{Autowired// 告诉Spring请帮我把UserDao的实例注入进来privateUserDaouserDao;publicvoidsave(){userDao.save();}}DI依赖注入Spring把需要的对象注入到对象里面你的 UserService 依赖 UserDao没有 UserDao 就没法干活 Spring 把 UserDao 注入送进到 UserService 里一共有三种注入方式构造器注入Setter注入字段注入构造器注入ServicepublicclassUserService{privatefinalUserDaouserDao;// 通过构造函数把依赖送进来publicUserService(UserDaouserDao){this.userDaouserDao;}}Setter注入ServicepublicclassUserService{privateUserDaouserDao;// 通过setter方法注入AutowiredpublicvoidsetUserDao(UserDaouserDao){this.userDaouserDao;}}字段注入ServicepublicclassUserService{Autowired// 直接标在字段上privateUserDaouserDao;}不同位置的含义// 方式1放在构造器上 ServicepublicclassOrderService{privatefinalOrderDaoorderDao;Autowired// 告诉Spring创建OrderService时请调用这个构造器publicOrderService(OrderDaoorderDao){// ^^^^^^^^^// Spring 看到构造器需要 OrderDao// 就去容器里找一个 OrderDao 传进来this.orderDaoorderDao;}}// 方式2放在 setter 方法上 ServicepublicclassOrderService{privateOrderDaoorderDao;Autowired// 告诉Spring创建完 OrderService 后请调用这个 setter 方法publicvoidsetOrderDao(OrderDaoorderDao){// ^^^^^^^^^// Spring 找到 OrderDao传进来this.orderDaoorderDao;}}// 方式3放在字段上最常见ServicepublicclassOrderService{Autowired// 告诉Spring请直接把 OrderDao 的实例塞到这个字段里privateOrderDaoorderDao;// ^^^^^^^^^^// Spring 用反射直接把值塞进去// 不经过任何方法直接改字段的值}Bean和Spring容器BeanBean就是一个交给Spring容器的Java对象Service// 这个注解告诉Spring请把UserService当成Bean来管理publicclassUserService{...}Repository// 这个注解告诉Spring请把UserDao当成Bean来管理publicclassUserDao{...}Service、Repository、Component、Controller → 都是在贴标签告诉 Spring这个类请你管理 Spring 看到标签后就会自动创建这个类的实例放进容器里 以后谁需要这个对象Spring 就从容器里取出来给你 以上这些都是加载类上的Bean一般写在 Configuration 配置类里面**把方法返回的对象交给 Spring 容器成为 Bean**Spring容器就是存放Bean的容器AOP面向切面编程一句话定义把这些重复的、跟核心业务无关但又必须做的事情权限检查、日志、事务抽出来统一处理没有用AOP之前要进行日志管理的时候// 没有AOP每个方法都要写重复代码publicvoidaddUser(){checkPermission();// 权限检查log.info(开始执行);// 日志记录// 真正的业务逻辑只有这一行userDao.addUser();log.info(执行完毕);// 日志记录}publicvoiddeleteUser(){checkPermission();// 又要写一遍log.info(开始执行);// 又要写一遍userDao.deleteUser();log.info(执行完毕);// 又要写一遍}用了AOP之后Aspect// 这是一个切面ComponentpublicclassLogAspect{Before(execution(* com.example.service.*.*(..)))// 翻译在service包下所有方法执行之前先执行这段代码publicvoidbeforeLog(){log.info(方法开始执行);}After(execution(* com.example.service.*.*(..)))// 翻译在service包下所有方法执行之后再执行这段代码publicvoidafterLog(){log.info(方法执行完毕);}}AOP里面的几个定义切入点Pointcut需要加附加逻辑的方法连接点JoinPoint所有能附加逻辑的方法通知Advice核心业务逻辑前后要做的东西就是通知切面Aspect切入点加通知就是一套增强方案目标对象Target就是核心业务逻辑代理Proxy就是一个代理对象做的事情是核心逻辑加附加逻辑

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询