IOC,全称为inversion of control 控制反转 控制反转:控制权从调用的类转换到spring容器,由spring来实例化对象及依赖注入 那怎么去理解控制反转?我们可以从一个简单例子来理解
未使用spring时,各个类的控制关系 spring框架下的控制关系默认构造器实例化
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"/>主要有以下五大作用域
protoype 原型----每次创建一个实例singleton 单例-----一个bean的定义,只有一个实例,不是一个类只有一个实例(默认为单例模式)request 一个请求一个实例session 一个会话一个实例websocket 一个websocket连接一个实例生命周期
在.xml文件bean配置上写init-method和destory-method实现initializingBean和DisposableBean及其方法依赖注入分为setter注入和构造器注入
注解在具体介绍注入方式之前,先介绍一下注入相关的注解
注册springbean:
@Controller 标注Controller控制器组件 @Service 标注Service业务逻辑组件 @Repository 标注Dao组件 @Component 其他组件自动依赖注入:
@Autowired 对类的属性,构造器,方法进行注值 @Value 对属性进行注值生命周期:
@PostConstruct 初始化@Predestory 销毁 作用范围:
@Scope分为两种
读取配置文件
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 { }