Spring有两大核心思想:
1.控制反转(IOC)依赖注入(DI)
2.面向切面编程(AOP)
先说Spring的第一大核心思想,“控制反转 依赖注入”,这八个字究竟是什么意思呢?
控制反转是指将创建对象的权力交由Spring容器来管理,依赖注入则是指应用程序运行时,每一个Bean对象都依赖Ioc容器注入当前Bean对象所需要的另一个Bean对象。
该思想很大程度上使降低了项目组件之间的耦合关系,实现了解耦。
Spring IOC容器就是利用控制反转-依赖注入的思想来创建并管理Bean。这里的管理是指根据bean与bean之间的关系来完成相应的注入。
依赖注入有3种实现方式:
1.Set注入(通过set方法注入)
2.构造注入(通过构造方法注入)
3.属性注入(通过参数注入,不推荐)
利用三层架构来举例Set注入和构造注入。
1.Set注入
控制层:
//利用三层架构实现调用:控制层==》业务层==》数据访问层
public class IUserControllerImpl implements IUserController {//依赖注入时有接口调用接口注入,没有接口再通过实现类注入private IUserService service = null;//通过DI依赖注入的方式注入业务层//set方法public void setService(IUserService service) {this.service = service;}public void save() throws ClassNotFoundException, InstantiationException, IllegalAccessException, IOException {System.out.println("====控制访问层===");service.save();}
业务层
public class IUserServiceImpl implements IUserService {//业务层接口private IUserDao dao = null;//set方法public void setDao(IUserDao dao) {this.dao = dao;}public void save() {System.out.println("=====业务访问层====");dao.save();}
}
数据访问层:
public class IUserDaoImpl implements IUserDao {public void save() {System.out.println("====数据访问层===");}
}
在applicationContext.xml中完成bean对象之间的注入:
<!--set注入对象--><bean id="controller" class="com.xun.controller.IUserControllerImpl"><!--将业务层通过set方法注入数据访问层--><property name="service" ref="service"></property></bean><!--配置业务层--><bean id="service" class="com.xun.service.IUserServiceImpl"><!--将数据访问层注入业务层--><property name="dao" ref="dao"></property></bean><!--配置数据访问层--><bean id="dao" class="com.xun.dao.IUserDaoImpl"></bean>
测试类:
public class Test01 {public static void main(String[] args) throws ClassNotFoundException, IOException, InstantiationException, IllegalAccessException {//通过SpringApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");//注入对象(控制层)IUserControllerImpl controller = (IUserControllerImpl) applicationContext.getBean("controller");controller.save();
}
观察结果:
说明利用set注入成功,并完成了各个对象之间的调用(即依赖关系的注入)。
2.构造注入
控制层:
public class UserControllerImp implements IUserController {//业务类IUserSerivce serivce;//构造注入(构造方法的重载)public UserControllerImp(IUserSerivce serivce) {this.serivce = serivce;}public UserControllerImp() {//无参构造}@Overridepublic void save() {System.out.println("===controller控制访问层===");serivce.save();}
}
业务层:
public class UserSerivceImp implements IUserSerivce {//数据访问层IUserDao dao;//构造注入public UserSerivceImp(IUserDao dao) {this.dao = dao;}public UserSerivceImp() {//无参构造}@Overridepublic void save() {System.out.println("===service业务访问层===");dao.save();}
}
数据访问层:
public class UserDaoImp implements IUserDao {@Overridepublic void save() {System.out.println("===dao数据访问层===");}
}
在applicationContext.xml中完成bean对象之间的注入:
<!--构造注入对象--><!--先注入数据访问层,以便业务层的引用--><bean id="daoImp" class="com.apesource.dao.UserDaoImp"></bean><!--业务层--><bean id="serivceImp" class="com.apesource.service.UserSerivceImp"><constructor-arg name="dao" ref="daoImp"></constructor-arg></bean><!--控制层--><bean id="controllerImp" class="com.apesource.controller.UserControllerImp"><constructor-arg name="serivce" ref="serivceImp"></constructor-arg></bean>
测试类:
public class Test01 {public static void main(String[] args) {ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");//拿到控制器对象IUserController controller = (IUserController) applicationContext.getBean("controllerImp");controller.save();}
}
结果:
说明利用构造注入成功,并完成了各个对象之间的调用(即依赖关系的注入)。