1.IOC容器(底层原理)
1.1 什么是IOC
1.1.1 控制反转,把对象创建和对象之间的调用过程交给spring管理
1.1.2 目的:降低耦合度。
1.2 IOC底层原理
xml解析,工场模式,反射。
2.IOC接口(BeanFactory)
3.IOC操作bean管理
3.1 什么是bean管理(指的是两个操作)
(1)spring创建对象
(2)spring注入属性
3.2 bean创建的两种方式
3.2.1 基于xml
1)基于xml创建对象
2)基于xml方式注入属性--DI(依赖注入)---属性注入的前提是对象已经创建好。
2-1)使用set方法实现DI
public class User {
String name;
public void setName(String name) {
this.name = name;
}
public void testUser(){
System.out.println(name);
}
}
<?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 http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--创建user对象-->
<bean id="user" class="com.cap.test.User">
<!--使用property标签完成属相注入
name:属性名
value:属性值
-->
<property name="name" value="伊佐奈美須八尾" />
</bean>
</beans>
public class UserTest {
@Test
public void testAdd(){
ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml");
User user = context.getBean("user", User.class);
user.testUser();
}
}
2-2)使用有参数的构造器实现DI
public class User {
String name;
int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
public void testUser(){
System.out.println(name);
System.out.println(age);
}
}
<?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 http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--创建user对象-->
<bean id="user" class="com.cap.test.User">
<!--使用constructor-arg标签完成属相注入
name:属性名
value:属性值
或者
index:参数顺序
value:属性值
-->
<constructor-arg name="name" value="伊佐奈美須八尾"/>
<constructor-arg name="age" value="15"/>
<constructor-arg index="0" value="伊佐奈美須八尾"/>
<constructor-arg index="1" value="16"/>
</bean>
</beans>
2-3)基于xml属性注入特殊值
あ:null值注入
<!--创建Conact对象-->
<bean id="conact" class="com.cap.test.Conact">
<property name="age" value="15"/>
<!--在property标签中使用<null/>标签代表null值-->
<property name="address">
<null/>
</property>
</bean>
い:注入包含特殊字符的值
<!--创建Conact对象-->
<bean id="conact" class="com.cap.test.Conact">
<property name="age" value="15"/>
<property name="address">
<!--在value标签中使用CDATA注入特殊字符
![CDATA[value]]
-->
<value><![CDATA[<<南京>>]]></value>
</property>
</bean>
う:set方法实现外部bean注入。
import com.cap.test.Dao.UserDao;
public class UserService {
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void service(){
System.out.println("service************");
userDao.update();
}
}
public interface UserDao {
public void update();
}
public class UserDaoImpl implements UserDao {
@Override
public void update() {
System.out.println("UserDao*******");
}
}
<?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 http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--创建UserService和UserDaoImpl对象-->
<bean name="userService" class="com.cap.test.Service.UserService">
<!--注入外部bean,通过set方法注入
ref:需要导入外部bean
-->
<property name="userDao" ref="userDao"/>
</bean>
<bean name="userDao" class="com.cap.test.Dao.UserDaoImpl"></bean>
</beans>
え:set方法实现内部bean注入。
<?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 http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--创建UserService和UserDaoImpl对象-->
<bean name="userService" class="com.cap.test.Service.UserService">
<!--注入内部bean,通过set方法注入
内部bean VS 外部bean
内部bean :生成bean的过程另外一个bean内部
外部bean :生成bean的过程另外一个bean外部
-->
<property name="userDao">
<bean name="userDao" class="com.cap.test.Dao.UserDaoImpl"></bean>
</property>
</bean>
</beans>
お:实现级联赋值
た:IOC中的bean管理(bean的作用域)
3.2.2 基于注解(需要引入spring-aop-5.3.5.jar包)
あ:Spring针对bean的创建提供的注解
① @Componet
② @Service
③ @Controller
④ @Repository
い:基于注解的方式创建bean实例准备
①:引入依赖 spring-aop-5.3.5.jarS
②:开启组件扫描
③:添加注解测试