前言
自己实现 SpringMVC 底层机制 系列之-实现任务阶段 4- 完成自定义@Service 注解功能
个人主页:尘觉主页
个人简介:大家好,我是尘觉,希望我的文章可以帮助到大家,您的满意是我的动力
在csdn获奖荣誉: csdn城市之星2名
Java全栈群星计划top前5
端午大礼包获得者
欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,感谢大家的观看
如果文章有什么需要改进的地方还请大佬不吝赐教 先在次感谢啦
功能说明: 如果给某个类加上@Service, 则可以将其注入到我们的 Spring 容器
给 Service 类标注@Service, 可以将对象注入到 Spring 容器中
- 并可以通过接口名支持多级, 类名来获取到 Service Bean
monsterService=com.wyxdu.service.impl.MonsterServiceImpl@6cc86233, monsterServiceImpl=com.wyxdu.service.impl.MonsterServiceImpl@6cc86233,
public class Monster {
private Integer id;
private String name;
private String skill;
private Integer age;
public Monster(Integer id, String name, String skill, Integer age) {
this.id = id;
this.name = name;
this.skill = skill;
this.age = age;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSkill() {
return skill;
}
public void setSkill(String skill) {
this.skill = skill;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Monster{" +
"id=" + id +
", name='" + name + '\'' +
", skill='" + skill + '\'' +
", age=" + age +
'}';
}
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Service {
String value() default "";
}
public interface MonsterService{
//增加方法-返回monster列表
public List<Monster> listMonster();
}
@Service
public class MonsterServiceImpl implements MonsterService {
@Override
public List<Monster> listMonsters() {
ArrayList<Monster> monsters = new ArrayList<>();
monsters.add(new Monster(100, "牛魔王", "芭蕉扇", 500));
monsters.add(new Monster(200, "蜘蛛精", "吐口水", 200));
return monsters;
}
}
public void executeInstance() {
//判断是否扫描到类
if (classFullPathList.size() == 0) {//说明没有扫描到类
return;
}
try {
//遍历classFullPathList,进行反射
for (String classFullPath : classFullPathList) {
Class<?> clazz = Class.forName(classFullPath);
//说明当前这个类有@Controller
if (clazz.isAnnotationPresent(Controller.class)) {
//得到类名首字母小写
String beanName = clazz.getSimpleName().substring(0, 1).toLowerCase() +
clazz.getSimpleName().substring(1);
ioc.put(beanName, clazz.newInstance());
} //如果有其它的注解,可以扩展 , 来处理@Service
else if (clazz.isAnnotationPresent(Service.class)) {//如果类有@Serivce注解
//先获取到Service的value值=> 就是注入时的beanName
Service serviceAnnotation =
clazz.getAnnotation(Service.class);
String beanName = serviceAnnotation.value();
if ("".equals(beanName)) {//说明没有指定value, 我们就使用默认的机制注入Service
//可以通过接口名/类名[首字母小写]来注入ioc容器
//1.得到所有接口的名称=>反射
Class<?>[] interfaces = clazz.getInterfaces();
Object instance = clazz.newInstance();
//2. 遍历接口,然后通过多个接口名来注入
for (Class<?> anInterface : interfaces) {
//接口名->首字母小写
String beanName2 = anInterface.getSimpleName().substring(0, 1).toLowerCase() +
anInterface.getSimpleName().substring(1);
ioc.put(beanName2, instance);
}
//3. 使用类名的首字母小写来注入bean
// 通过 clazz 来即可.
String beanName2 = clazz.getSimpleName().substring(0, 1).toLowerCase() +
clazz.getSimpleName().substring(1);
ioc.put(beanName2, instance);
} else {//如果有指定名称,就使用该名称注入即可
ioc.put(beanName, clazz.newInstance());
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
(启动 Tomcat, 自动加载 wyxDispatcherServlet, 完成 IOC 容器的注入) 前面有结果
扫描后的ioc= {monsterService=com.wyxedu.service.impl.MonsterServiceImpl@6323a1c1,
orderController=com.wyxedu.controller.OrderController@4c96ec4f,
monsterController=com.wyxedu.controller.MonsterController@81664b3}
本文完成了实现任务阶段 4- 完成自定义@Service 注解功能下一阶段
实现任务阶段 5- 完成 Spring 容器对象的自动装配 -@Autowried
自己实现 SpringMVC 底层机制 核心分发 控制器+ Controller 和 Service 注入容器 + 对象自动装配 + 控制器 方法获取参数 + 视图解析 + 返回 JSON 格式数系列
第一篇-> 自己实现 SpringMVC 底层机制 系列之搭建 SpringMVC 底层机制开发环境和开发WyxDispatcherServlet_springmvc分发器
第二篇-> 自己实现 SpringMVC 底层机制 系列之–实现任务阶段 2- 完成客户端浏览器可以请求控制层
第三篇-> 自己实现 SpringMVC 底层机制 系列之–实现任务阶段 3- 从 web.xml动态获取 wyxspringmvc.xml
热门专栏推荐
想学习vue的可以看看这个
java基础合集
数据库合集
redis合集
nginx合集
linux合集
等等等还有许多优秀的合集在主页等着大家的光顾感谢大家的支持
欢迎大家加入我的社区 尘觉社区
文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起来评论区一起讨论
希望能和诸佬们一起努力,今后我们一起观看感谢您的阅读
如果帮助到您不妨3连支持一下,创造不易您们的支持是我的动力