1.spring-DI
IOC:控制反转 创建对象!
DI(Dependency Injection),即“依赖注入”,组件之间依赖关系由容器在运行期决定,即容器动态的将某个依赖关系注入到组件当中。它是是 Spring 框架核心IOC技术的具体实现。
依赖注入是控制反转最常用的方式,通过控制反转可以减低计算机代码之间的耦合度。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。
依赖注入的类型有哪些?
基本数据类型, 字符串类型,引用类型,集合类型。其他bean类型(在配置文件中或者注解配置过的bean)。
2. 如何实现注入对象的属性值
(1)创建一个类提供set方法
package com.hzk.demo;
/**
* @author hzk
* @date 2022/6/13 19:56
*/
public class Stu {
private String name;
private Integer age;
public Stu() {
}
@Override
public String toString() {
return "Stu{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
(2)配置文件
<?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">
<!--spring容器会帮你创建该bean的对象-->
<bean id="stu" class="com.hzk.demo.Stu">
<!--
property:表示为类中属性注入值,调用的为set方法
name:表示属性名
value:注入基本类和字符串类型时使用value
-->
<property name="name" value="刘大哥"/>
<property name="age" value="15"/>
</bean>
</beans>
3. 使用spring注入其他数据类型。
(1)创建实体类
package com.hzk.demo1;
import java.awt.*;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
/**
* @author hzk
* @date 2022/6/13 20:04
*/
public class Stu {
private String name;
private Integer age;
private Integer[] sex;
private Map<String,String> map;
private java.util.List<String> hobby;
private Cla cla;
public Integer[] getSex() {
return sex;
}
public List<String> getHobby() {
return hobby;
}
public void setHobby(List<String> hobby) {
this.hobby = hobby;
}
public void setSex(Integer[] sex) {
this.sex = sex;
}
public Map<String, String> getMap() {
return map;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
@Override
public String toString() {
return "Stu{" +
"name='" + name + '\'' +
", age=" + age +
", sex=" + Arrays.toString(sex) +
", map=" + map +
", cla=" + cla +
'}';
}
public Stu() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Cla getCla() {
return cla;
}
public void setCla(Cla cla) {
this.cla = cla;
}
}
(2)配置文件
<?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">
<bean id="stu" class="com.hzk.demo1.Stu">
<property name="name" value="晓东"/>
<property name="age" value="11"/>
<property name="cla" ref="clas"/>
<property name="sex">
<array>
<value>1</value>
<value>2</value>
<value>3</value>
</array>
</property>
<property name="map">
<map>
<entry key="name" value="气球"/>
<entry key="price" value="很贵"/>
</map>
</property>
<property name="hobby">
<list>
<value>吃吃</value>
<value>喝喝</value>
<value>睡睡</value>
</list>
</property>
</bean>
<bean id="clas" class="com.hzk.demo1.Cla">
<property name="claId" value="1"/>
<property name="claName" value="牛逼1班"/>
</bean>
</beans>
4 自动注入
(1)控制层
public class UserController {
private Service service;
public void setService(Service service) {
this.service = service;
}
public void fun(){
service.show();
}
}
(2)业务层
public interface Service {
public void show();
}
public class UserDao1 implements Service{
@Override
public void show() {
System.out.println("1111111111111");
}
}
public class UserDao2 implements Service{
@Override
public void show() {
System.out.println("222222222222");
}
}
(3)配置文件
<?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">
<!--<bean id="userController" class="com.hzk.demo2.UserController" autowire="byType">
</bean>
<bean id="userDao1" class="com.hzk.demo2.UserDao1"></bean>-->
<!--autowire:自动注入属性值
no:不设置自动注入 默认值
byName:按照属性名称自动注入属性值
byType:按照属性的类型自动注入。-->
<bean id="userController" class="com.hzk.demo2.UserController" autowire="byName">
</bean>
<bean id="userDao1" class="com.hzk.demo2.UserDao1"></bean>
<bean id="service" class="com.hzk.demo2.UserDao2"></bean>
</beans>
5. 使用注解完成IOC和DI功能
(1)包扫描配置文件
<context:component-scan base-package="com.hzk.demo3"/>
(2)创建controller
package com.hzk.demo3;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
/**
* @author hzk
* @date 2022/6/13 20:39
*/
@Controller //表示控制层注解,如何没有设置bean的id 默认为类的名称首字母小写,相当于在spring配置文件中<bean id="" class="com.hzk.demo3.UserController">
public class UserController {
@Autowired //按照类型注入 如果需要自己指定名称注入需要使用另一个注解配合使用
@Qualifier(value = "userDao1")//<property name="service" ref="userDao"
private Service service;
public void setService(Service service) {
this.service = service;
}
public void fun(){
service.show();
}
}
(3) dao接口和实现类
@Repository
public class UserDao implements Service{
@Override
public void show() {
System.out.println("这是我自己写的");
}
}
public interface Service {
public void show();
}
@Controller+@Respository+@Service+@Component
没有区别: 他们的底层都是用的@Component
实际意思就在于区分层的。
@Controller控制层
@Respository持久化层
@Service 业务层
@Component 最底层的bean注解。