Spring IOC本质
1、没有使用控制反转思想
public interface UserDao {
void show();
}
public class UserDaoImpl implements UserDao{
@Override
public void show() {
System.out.println("MySQL数据库");
}
}
public interface UserService {
void data();
}
public class UserServiceImpl implements UserService {
private UserDao userDao = new UserDaoImpl();
@Override
public void data() {
userDao.show();
}
}
public class MyTest {
public static void main(String[] args) {
UserService userService = new UserServiceImpl();
userService.data();
}
}
没有使用控制反转,实现类继承接口,service层要使用dao层,就要在service层通过new对象,来获取dao层对象使用。
当业务需要改变是,需要修改代码达到要求。
// private UserDao userDao = new UserDaoImpl();
private UserDao userDao = new UserOracalDaoImpl();
修改UserServiceImpl才可以。程序的主动权在程序员手上。
2、使用IOC思想
通过set注入方式实现控制反转
public class UserServiceImpl implements UserService {
private UserDao userDao;
public UserServiceImpl(UserDao userDao) {
this.userDao = userDao;
}
@Override
public void data() {
userDao.show();
}
}
修改UserServieImpl的构造方法,通过set反方式注入,在使用时,传入,程序被动接收对象。
public class MyTest {
public static void main(String[] args) {
UserService userService = new UserServiceImpl(new UserOracalDaoImpl());
userService.data();
}
}
这样程序的控制权,就交由用户,只需要用户传入要选择的Dao类型就可以了,不用修改底层UserServcieImpl类的代码,就可以实现控制反转。
由Spring实现IOC
类定义如上,然后再添加Spring配置文件ben.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="userDaoImpl" class="com.nick.pojo.UserDaoImpl">
</bean>
<bean id="userOracalDaoImpl" class="com.nick.pojo.UserOracalDaoImpl">
</bean>
<bean id="userServiceImpl" class="com.nick.pojo.UserServiceImpl">
<constructor-arg index="0" ref="userDaoImpl"></constructor-arg>
</bean>
<bean id="hello" class="com.nick.pojo.Hello">
<property name="name" value="xioalu"></property>
</bean>
</beans>
然后在使用对象的时候,不需要new,只需要在容器中取。
public class MyTest {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
UserService userServiceImpl = (UserService) context.getBean("userServiceImpl");
userServiceImpl.data();
}
}
## IOC创建对象的方式
1、默认无参构造方法
2、有参构造方法
1.类型
<bean id="exampleBean" class="examples.ExampleBean">
<constructor-arg type="int" value="7500000"/>
<constructor-arg type="java.lang.String" value="42"/>
</bean>
2、下标
<bean id="exampleBean" class="examples.ExampleBean">
<constructor-arg index="0" value="7500000"/>
<constructor-arg index="1" value="42"/>
</bean>
3、名字
<bean id="exampleBean" class="examples.ExampleBean">
<constructor-arg name="years" value="7500000"/>
<constructor-arg name="ultimateAnswer" value="42"/>
</bean>