欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

三大框架 — 业务层框架Spring+IoC+DI

程序员文章站 2022-04-22 23:51:23
三大框架:业务层框架Spring+IoC+DI1. 初识Spring框架2. IoC控制反转实现原理使用步骤代码实现举例DI依赖注入代码实现举例1. 初识Spring框架Spring是一个业务层框架,实现类ioc容器和aop。用spring添加依赖业务层主要处理业务逻辑如:注册时在业务层判断用户名是否存在。获取商品价格时,判断用户是否是会员,商品有没有参加店铺活动,有没有参加商城活动。@Service :表示这个类是业务层的类,spring就会创建对象,放在容器中@autowired:由...

1. 初识Spring框架

Spring是一个业务层框架,实现类ioc容器和aop。
用spring添加依赖

业务层主要处理业务逻辑如:

  • 注册时在业务层判断用户名是否存在。
  • 获取商品价格时,判断用户是否是会员,商品有没有参加店铺活动,有没有参加商城活动。

@Service :表示这个类是业务层的类,spring就会创建对象,放在容器中
@autowired:由spring提供的,spring框架从容器中找到一个类型为UserService 的对象并赋值。容器管理对象的生命周期。容器类似于池(池有大小)。
eg:
@autowired
UserService userService;

2. IoC控制反转

2.1 实现原理

IOC(控制反转)就是依赖倒置原则的一种代码设计思路。就是把原先在代码里面需要实现的对象创建、对象之间的依赖,反转给容器来帮忙实现。
Spring IOC容器通过xml,注解等其它方式配置类及类之间的依赖关系,完成了对象的创建和依赖的管理注入。实现IOC的主要设计模式是工厂模式

优点:

  • 集中管理,实现类的可配置和易管理。
  • 降低了类与类之间的耦合度。

2.2 代码实现举例

package com.tedu.springioc01.service;
//定义一个业务层的接口
public interface UserService {
	public String register();
}
package com.tedu.springioc01.service;
//接口的实现类
import org.springframework.stereotype.Service;

//@Service 表明这是一个业务层类,由框架创建对象
@Service
public class UserServiceImpl implements UserService{
	@Override
	public String register() {
		//判断用户名是否注册过
		return "注册成功";		
	}
}
//控制层
@RestController
public class UserController {

//@Autowired 注解,则由框架给userService赋值,不用程序员创建
	@Autowired
	UserService userService;

	@RequestMapping("/register")
	public String register() {
		String result=userService.register();
		return result;
	}
}

2.3 相关面试题

IOC和DI的关系

DI(依赖注入):由IOC容器在运行期间, 动态地将某种依赖关系注入到对象之中。

关系:
IoC(控制反转)是设计思想,IoC有三个核心:BeanFactory、反射、DI(依赖注入)。BeanFactory利用反射实现对象的创建,DI实现对象关系管理。

什么是自动装配

利用注解方式,我们只需要写@Autowired注解,底层就会去容器中找对应的对象,如果有获取到,利用反射调用其对应的set方法,设值。而这个调用过程都是自动,我们没有手工去写set方法。所以这个过程也称为自动装配。

3. 框架原理 (代码实现)

package com.tedu.mall;
//业务层
public class UserServiceImpl {

}
package com.tedu.mall;
//控制层
import org.spring.ioc.Autowired;

public class UserController {

	@Autowired
	UserServiceImpl userServiceImpl;
}
package org.spring.ioc;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
//定义注解
@Target(ElementType.FIELD) //定义注解的作用目标
@Retention(RetentionPolicy.RUNTIME)//定义注解的使用范围
public @interface Autowired {
	
}

package org.spring.ioc;

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Set;

import com.tedu.mall.UserController;
import com.tedu.mall.UserServiceImpl;

//spring框架
public class SpringIOCMain {
	
	private static Object object;
	static HashMap<String, Object> container = new HashMap<>(); //容器
	public static void main(String[] args) throws Throwable {
		//扫描类,创建对象,放到容器
		loadObject();
		//判断属性有没有加autowired注解,加了给属性赋值
		autowiredProcess();
		
		//测试userController的userServiceImpl属性有没有值
		UserController userController = (UserController) container.get("userController");
		System.out.println(userController.toString());
	}
	
	private static void loadObject() {
		UserController userController = new UserController();
		container.put("userController", userController);//key:类名的首字母小写   value的值可以随便
		UserServiceImpl userServiceImpl = new UserServiceImpl();
		container.put("userServiceImpl", userServiceImpl);		
	}

	private static void autowiredProcess() throws Throwable {
		// 遍历容器中的所有对象
		Set<String> keySet = container.keySet();
		for (String key : keySet) {
			System.out.println("key="+key); //输出key=userController	key=userServiceImpl
			//得到对象
			Object object  = container.get(key);
			//得到对象的类对象
			Class clazz = object.getClass();
			//取出对象的所有属性
			Field[] fields = clazz.getDeclaredFields();
			//判断属性有没有加autowired注解
			for (Field field : fields) {
				Autowired autowired = field.getAnnotation(Autowired.class);
				//如果加了,则从容器中找到对应的对象,赋值
				if (autowired!=null) {
					//serviceInstance是userServiceImpl对象
					Object serviceInstance = container.get(field.getName());
					//给属性赋值
					field.setAccessible(true);//变成public
					field.set(object, serviceInstance);
				}
			}
		}
	}

}

本文地址:https://blog.csdn.net/weixin_46439070/article/details/109611446