IOC和AOP是Spring框架的核心了
IOC是控制反转,就是把创建对象的工作交给容器做,程序不再有主动权,变成了被动接受对象。减少代码的耦合性。
DI是依赖注入,是实现IOC的方式。
IOC的思想原理
定义一个接口
package com.xzr.demo.spring.ioc.ioc_set.dao;
public interface userDao {
public void user();
}
两个实现类
package com.xzr.demo.spring.ioc.ioc_set.dao;
public class redisimpl implements userDao{
@Override
public void user() {
System.out.println("redis的数据");
}
}
package com.xzr.demo.spring.ioc.ioc_set.dao;
public class mysqlimpl implements userDao{
@Override
public void user() {
System.out.println("Mysql的数据");
}
}
要输出user方法里的内容,定义一个Service接口
package com.xzr.demo.spring.ioc.ioc_set.service;
public interface userserver {
void getUSER();
}
一个Service的实现类
package com.xzr.demo.spring.ioc.ioc_set.service;
import com.xzr.demo.spring.ioc.ioc_set.dao.mysqlimpl;
import com.xzr.demo.spring.ioc.ioc_set.dao.redisimpl;
import com.xzr.demo.spring.ioc.ioc_set.dao.userDao;
public class UserService implements userserver{
private mysqlimpl myimpl= new mysqlimpl();
@Override
public void getUSER() {
myimpl.user();
}
}
然后写个main方法
public class UserMain {
public static void main(String[] args) {
UserService us = new UserService();
us.getUSER();
}
}
这样就能调用那个dao接口的实现类,打印出对应的内容,但是如果要拓展另一个实现类,就要重新new方法,那么就会不断的改Servie的代码,添加Servie类,工作量也太大了。
所以想到用在Service层添加set方法,把接口注入进去。
public class UserService implements userserver{
private userDao userDao;
//dao层的set方法
public void setUserdao(userDao userdao){
this.userDao=userdao;
}
@Override
public void getUSER() {
userDao.user();
}
}
调用层只要给us.setUserdao的方法里传入不同的参数,就能实现调用不同的接口实现类,这样的方式是不用在service层new 实现类对象的,也不用改变service的方法。
public class UserMain {
public static void main(String[] args) {
UserService us = new UserService();
//us.setUserdao(new mysqlimpl());
us.setUserdao(new redisimpl());
us.getUSER();
}
}
Spring的IOC实现
pom.xml导包
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.6</version>
</dependency>
写applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-aop.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- id是类的名称,name 是类的路径,不能随便起-->
<bean id="mysqlimpl" class="com.xzr.demo.spring.ioc.ioc_set.dao.mysqlimpl">
</bean>
<bean id="redisimpl" class="com.xzr.demo.spring.ioc.ioc_set.dao.redisimpl">
</bean>
<bean id="UserService" class="com.xzr.demo.spring.ioc.ioc_set.service.UserService">
<property name="userdao" ref="mysqlimpl"></property>
</bean>
</beans>
Service层
public class UserService implements userserver{
private userDao userDao;
public void setUserdao(userDao userdao){
this.userDao=userdao;
}
@Override
public void getUSER() {
userDao.user();
}
}
Main层不用new对象
public class UserMain {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserService us= (UserService) context.getBean("UserService");
us.getUSER();
}
}
控制台输出
如果想要换实现类只需要修改ref属性,或者重新建一个ServiceBean
基于注解的IOC
@Autower等