<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-webmvcartifactId>
<version>5.2.7.RELEASEversion>
dependency>
控制反转是一种通过描述(在 Java 中可以是 XML 或者注解)并通过第三方(Spring)去产生或获取特定对象的方式。
当我们写一个普通项目时,一般是这样的
package dao;
public interface UserDao {
void query();
}
package dao;
public class UserDaoimp implements UserDao {
public void query(){
System.out.println("查询用户");
}
}
package service;
import dao.UserDao;
import dao.UserDaoimp;
public class userService {
private UserDao userDao = new UserDaoimp();
public void query(){
userDao.query();
}
}
假设现在用户有了新的需求,又多了一个UserDao的实现类
package dao;
public class MysqlDaoImp implements UserDao {
public void query() {
System.out.println("mysql查询");
}
}
服务层调用这个类时,还需要去改变服务层代码
package service;
import dao.MysqlDaoImp;
import dao.UserDao;
import dao.UserDaoimp;
public class userService {
private UserDao userDao = new MysqlDaoImp();
public void query(){
userDao.query();
}
}
这样用户的需求会影响可能会影响我们的代码,我们需要根据用户的需求去修改源代码,在一个大的项目中,如果代码量过大,这个过程的成本是很高的
解决方法:set
public class userService {
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
}
这就是控制反转的基本思想,这个例子我觉得太小了,理解可能不是那么深,但意思我还是能理解的,因为刚开始学,我觉得后面可能会理解的更深入
控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法 , 我们使用面向对象编程 , 对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方
IoC是Spring框架的核心内容,使用多种方式完美的实现了IoC,可以使用XML配置,也可以使用注解,新版本的Spring也可以零配置实现IoC。
采用XML方式配置Bean的时候,Bean的定义信息是和实现分离的,而采用注解的方式可以把两者合为一体,Bean的定义信息直接以注解的形式定义在实现类中,从而达到了零配置的目的。
beans.xml
<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="..." class="...">
bean>
<bean id="..." class="...">
bean>
beans>
编写一个实体类
package pojo;
public class hello {
private String name;
@Override
public String toString() {
return "name:" + this.getName();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
获取Spring上下文对象
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
配置beans.xml
<bean id="hello" class="pojo.Hello">
<property name="name" value="Spring"/>
bean>
测试使用
@Test
public void test(){
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
//通过IOC容易获得对象
//可以进行类型强转
Object hello = context.getBean("hello");
System.out.println(hello.toString());
}
对象的属性设置和对象的创建都是由Spring执行的,当我们需要不同的操作时,只需要在xml文件中去修改就行了,无须操作我们的程序源码
daos.xml
<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="userDao" class="dao.UserDaoImp"/>
<bean id="mysqlDao" class="dao.MysqlDaoImp"/>
<bean id="userService" class="service.UserService">
<property name="userDao" ref="mysqlDao"/>
bean>
beans>
测试
@Test
public void test1(){
ApplicationContext context = new ClassPathXmlApplicationContext("daos.xml");
UserService userService = (UserService)context.getBean("userService");
userService.getUserDao().query();
}
package pojo;
public class User {
private String name;
private int age;
public User() {
System.out.println("User的无参构造");
}
@Override
public String toString() {
return "name = " + this.getName();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
<bean id="user" class="pojo.User">
<property name="name" value="xiaoming"/>
<property name="age" value="18"/>
bean>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Cnka5C6x-1595584943711)(C:%5CUsers%5CWIN10%5CDesktop%5C%E6%96%87%E4%BB%B6%5CSpring.assets%5C1595583915174.png)]
会默认调用无参构造方法
下标赋值
<bean id="user1" class="pojo.User">
<constructor-arg index="0" value="xxx"/>
<constructor-arg index="1" value="3"/>
bean>
根据参数类型赋值
<bean id="user2" class="pojo.User">
<constructor-arg type="java.lang.String" value="xxxx"/>
<constructor-arg type="int" value="11"/>
bean>
当参数中出现相同类型参数时,该方式不推荐使用
根据参数名赋值
<bean id="user3" class="pojo.User">
<constructor-arg name="name" value="qqq"/>
<constructor-arg name="age" value="222"/>
bean>
=“xxxx”/>
当参数中出现相同类型参数时,该方式不推荐使用
3. 根据参数名赋值
```xml