一、IoC概念:IoC是Inversion of Control 的缩写,译为“控制反转”;我们之前创建对象的时候,使用的是实例化方式,通过new关键字创建对象。Spring中的IoC方式对象的生命周期由Spring框架提供的Ioc容器来管理,将控制权交给了Ioc容器,也就是借助第三方实现具有依赖关系对象之间的解耦。使对象与对象之间没有什么直接联系。

二、bean的装配方式
1、基于XML装配
在Spring的IoC容器中,beans是常见的一个标签,它用来管理bean;对bean的管理是在配置文件中进行的,使用xml文件的形式。文件中包含bean的id、类、属性以及值。
bean 中常用的属性和子元素:
id:是bean的唯一标识,Spring容器对bean的配置,管理够通过该属性进行。
class:是指定bean的实现类,它必须使用类的权限定名
scope:用来设定bean实例的作用域,其属性值有singleton(单例)、prototype(原型)、websocket等,默认值是singleton
constructor-arg:bean元素的子元素,可以使用此元素传入构造参数进行实例化。该元素的index属性指定构造参数的序号,type指定构造参数的类型,参数值可以通过ref或value指定。
property:bean元素的子元素,用于调用bean实例中的setter()方法完成属性赋值,从而完成依赖注入。该元素的name属性指定bean实例中相应的属性名,ref属性或者value属性用来指定参数值。
ref:<constructor-arg>、<property>等元素的属性或者子元素,可以用于指定对bean工厂中某个bean实例的引用。
value:<constructor-arg>、<property>等元素的属性或子元素,可以用于定义一个常量的值。
Spring中提供了两种基于xml的装配方式, 构造注入和设值注入
构造方法注入使用的是<constructor-arg> 使用value来设置参数的值。
设值注入使用的是<property>,使用value来设置参数的值。
bean.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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 使用构造方法进行注入-->
<bean id="user1" class="com.itheima.service.impl.User">
<constructor-arg index="0" value="zhangsan" ></constructor-arg>
<constructor-arg index="1" value="18"></constructor-arg>
<constructor-arg index="2" >
<list>
<value>"constructorValue1"</value>
<value>"constructorValue2"</value>
</list>
</constructor-arg>
</bean>
<!--使用setter方法进行注入-->
<bean id="user2" class="com.itheima.service.impl.User">
<property name="userName" value="lisi"></property>
<property name="age" value="19"></property>
<property name="list">
<list>
<value>"listValue1"</value>
<value>"listValue2"</value>
</list>
</property>
</bean>
</beans>
业务层代码:
package com.itheima.service.impl;
import java.util.List;
import lombok.Data;
/**
* @version 1.0
* @Description
* @Author
* @CreateDate 2020/11/8 17:21
* @UpdateUser
* @UpdateDate
* @UpdateRemark
*/
public class User {
private String userName;
private String age;
private List<String> list;
/**
* @Describe 使用构造注入,提供带参数的构造方法
* @Author
* @Date 2020/11/8 19:00
* @param [userName, age, list]
* @Return * @return:null
*/
public User(String userName,String age,List<String> list){
this.userName=userName;
this.age=age;
this.list=list;
}
public User(){
super();
}
//使用setter方法
public void setUserName(String userName) {
this.userName = userName;
}
public void setAge(String age) {
this.age = age;
}
public void setList(List<String> list) {
this.list = list;
}
@Override
public String toString() {
return "User{" +
"userName='" + userName + '\'' +
", age='" + age + '\'' +
", list=" + list +
'}';
}
}
Client类:
package com.itheima.ui;
import com.itheima.service.IAccountService;
import com.itheima.service.impl.Person;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @ClassName:
* @description:
* @Author:
* @UpdateUser:
* @Datetime:2020/8/15 16:51
*/
public class Client {
public static void main(String[] args) {
//1、获取核心容器对象
ApplicationContext ac = new ClassPathXmlApplicationContext("bean.xml");
//2、根据id获取Bean对象
User user =(User) ac.getBean("user1");
User user =(User) ac.getBean("user2");
}
}
2、基于注解的装配
@Componet、@Respository、@Service、@Controller 这四个注解的功能一样,但是为了是注解用途更加清晰,在不同的层使用不同的注解。用这四个注解标识的类,说明此类是一个bean
@Autowired、@Resource 这两个注解功能一样,相当于对变量进行注入。
Service层代码:
package com.itheima.service.impl;
import com.itheima.service.UserService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
* @version 1.0
* @Description
* @Author
* @CreateDate 2020/11/8 19:26
* @UpdateUser
* @UpdateDate
* @UpdateRemark
*/
//使用@Service注解将UserServiceImpl类标识为Spring中的bean
@Service("userService")
public class UserServiceImpl implements UserService {
//使用@Resource注解注入
@Resource(name="userDao")
private UserDao userDao;
}
如上代码,首先使用@Service注解将UserServiceImpl类标示为Spring中的bean,这相当于配置文件中的
<bean id="userService" class="com.itheima.service.impl.UserServiceImpl">
然后使用@Resource注解标注在属性userDao中,这相当于配置文件中的
<property name="userDao" ref="userDao"></property>
1007





