Spring笔记二 IOC

mac2026-04-16  1

1、IOC介绍

IOC,全称为inversion of control 控制反转 控制反转:控制权从调用的类转换到spring容器,由spring来实例化对象及依赖注入 那怎么去理解控制反转?我们可以从一个简单例子来理解

未使用spring时,各个类的控制关系

spring框架下的控制关系

2、IOC的使用

2.1Bean实例化

默认构造器实例化

public class UserController { public UserController userController; }

配置.xml文件

<bean id="userConroller" class="woniuxy1102a.controller.UserController"/>

静态工厂方法实例化

<!-- 用静态工厂方法创建一个connection作为springbean --> <bean id="connection" class="woniuxy1102a.common.JDBCUtils"/> <!-- 某个类(JDBCUtils)的静态方法(getConnection),返回值作为bean --> public class CarFactory { public Car creatCar(){ return new Car(); } } .xml文件配置 <!-- 工厂bean --> <bean id="carFactory" class="woniuxy1102a.common.CarFactory"/> <!--car Bean--> <bean id="car" factory-bean="carFactory" factory-method="creatCar"/>

spring的FactoryBean接口实例化 一个类实现FactoryBean接口,实现其方法 配置之后,bean的实例为FactoryBean#getObject方法的返回值

public class CarFactory implements FactoryBean { @Override public Object getObject() throws Exception { return new Car(); } @Override public Class<?> getObjectType() { return Car.class; } } - 配置.xml文件 <bean id="car" class="woniuxy1102a.common.CarFactory"/>

2.2Bean的作用域及生命周期

主要有以下五大作用域

protoype 原型----每次创建一个实例singleton 单例-----一个bean的定义,只有一个实例,不是一个类只有一个实例(默认为单例模式)request 一个请求一个实例session 一个会话一个实例websocket 一个websocket连接一个实例

生命周期

在.xml文件bean配置上写init-method和destory-method实现initializingBean和DisposableBean及其方法

2.3依赖注入

依赖注入分为setter注入和构造器注入

注解

在具体介绍注入方式之前,先介绍一下注入相关的注解

注册springbean:

@Controller 标注Controller控制器组件 @Service 标注Service业务逻辑组件 @Repository 标注Dao组件 @Component 其他组件

自动依赖注入:

@Autowired 对类的属性,构造器,方法进行注值 @Value 对属性进行注值

生命周期:

@PostConstruct 初始化

@Predestory 销毁 作用范围:

@Scope

分为两种

.xml配置文件方式注入
读取配置.xml文件 public class App { public static void main( String[] args ) { ApplicationContext ac = new ClassPathXmlApplicationContext("aop.xml"); UserController userController = ac.getBean("userController", UserController.class); UserService userService = ac.getBean("userService", UserService.class); } } 纯.xml配置文件式 <bean id="userDao" class="woniuxy1102a.dao.impl.UserDaoImp"/> <!--将UserDaoImp注入UserServiceImp--> <bean id="userService" class="woniuxy1102a.service.impl.UserServiceImp"> <property name="userDao" ref="userDao"/> </bean> <!--将UserServiceImp注入UserController--> <bean id="userController" class="woniuxy1102a.controller.UserController"> <property name="userService" ref="userService"/> </bean> 注解+.xml配置 @Controller public class UserController { @Autowired public UserService userService; } <!--指定扫描的范围,包括递归的所有的包和子类--> <context:component-scan base-package="woniuxy1102a"/>
Java注解式注入

读取配置文件

public class App { public static void main( String[] args ){ ApplicationContext at = new AnnotationConfigApplicationContext(AopClass.class); UserController userController = at.getBean("userController", UserController.class); UserService userService = at.getBean("userService", UserService.class); } }

有xml文件式

@Component @Configuration public class AopClass { public UserDao userDao(){ return new UserDaoImp(); } public UserService userService(){ return new UserServiceImp(userDao()); } public UserController userController(){ return new UserController(userService()); } } <!--指定扫描的范围,包括递归的所有的包和子类--> <context:component-scan base-package="woniuxy1102a"/>

无xml文件

@Component @Configuration @ComponentScan("woniuxy1102a") public class AopClass { }
IOC的优势
解耦,类与类之间的耦合度降低提升代码的灵活性,可维护性
最新回复(0)