当前位置: 首页 > news >正文

wordpress 404跳转搜索引擎优化技巧

wordpress 404跳转,搜索引擎优化技巧,wordpress 多用户商城主题,php动态网站开发试卷目录 一、什么是 Spring IOC? 二、IOC 的作用 1. IOC 怎么知道要创建哪些对象呢? 2. 创建出来的对象放在哪儿? 3. 创建出来的对象如果有属性,如何给属性赋值? 三、实现步骤 1. 创建自定义注解 2. 创建 IOC 容器…

目录

一、什么是 Spring IOC?

二、IOC 的作用

1. IOC 怎么知道要创建哪些对象呢?

2. 创建出来的对象放在哪儿?

3. 创建出来的对象如果有属性,如何给属性赋值?

三、实现步骤

1. 创建自定义注解

2. 创建 IOC 容器

1. 创建 Bean 定义类

2. 创建 IOC 容器

3. 扫描包

4. 使用自定义注解

5. 在 Servlet 中初始化 IOC 对象

6. 测试

3. 实例化 Bean 

测试

4. 设置属性

1. 创建一个Controller

2. 属性赋值

3. 测试

四、使用 Bean

1. 创建获取 Bean 的方法

2. 使用 Bean 

3. 测试

五、优化 IOC 容器


一、什么是 Spring IOC?

Spring 的核心之一是 IOC,全称 Inversion Of Control ,控制反转,用来统一管理 Bean

二、IOC 的作用

IOC 的作用就是帮程序员创建 Bean 对象

1. IOC 怎么知道要创建哪些对象呢?

xml 配置文件中指定要创建哪些对象,或者使用注解的方式

如果使用注解的方式,需要自定义注解,自定义注解说白了就是告诉 JVM 这个 Bean 不同于其他普通的 Bean ,它有其他的用途,标记一下。

@Component、@Controller、@Service 可以用于创建 Bean 的注解

2. 创建出来的对象放在哪儿?

先记录需要被创建的 Bean 对象的信息,存到 HashMap 中,然后根据 HashMap 中存储的Bean 的信息创建对象,存到IOC容器中

3. 创建出来的对象如果有属性,如何给属性赋值?

使用注解 @Autowired

三、实现步骤

1. 创建自定义注解

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Controller {String value() default "";
}
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Autowired {String value() default "";
}

2. 创建 IOC 容器

扫描包,判断类上是否有注解,如果有,存储需要被创建的对象的id,也就是全类名。

定义一个类用于存储这些信息,这个类就是 BeanDefinition  叫做 Bean 定义类,Bean 定义类创建对象后称为 Bean 定义对象,这个对象存储了 Bean 的信息

然后把 Bean 定义对象存放到 HashMap 中,这个 Map 叫做 Bean 定义Map

1. 创建 Bean 定义类

package com.shao.IOC;public class BeanDefinition {private String id;private String className;public BeanDefinition() {}public BeanDefinition(String id, String className) {this.id = id;this.className = className;}/*** 获取** @return id*/public String getId() {return id;}/*** 设置** @param id*/public void setId(String id) {this.id = id;}/*** 获取** @return className*/public String getClassName() {return className;}/*** 设置** @param className*/public void setClassName(String className) {this.className = className;}public String toString() {return "BeanDefinition{id = " + id + ", className = " + className + "}";}
}

2. 创建 IOC 容器

3. 扫描包

扫描包需要先知道路径是什么,从哪开始

这里扫描的是编译后的 class 文件,并不是类文件,因为程序运行后使用的是编译后的文件

那如何从这里开始呢?

使用类加载器获取路径

package com.shao.IOC;import com.shao.Annotation.Controller;
import com.shao.Annotation.Service;import java.io.File;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.HashMap;/*** ApplicationContext 类. 当作 IOC 容器** @author shao.*/
public class ApplicationContext {/*** Bean 定义Map   存储Bean 定义对象*/private HashMap<String, BeanDefinition> beanDefinitionMap = new HashMap<>();/*** Bean 实例Map 存储Bean 实例对象*/private HashMap<String, Object> BeanMap = new HashMap<>();public ApplicationContext(String basePackage) throws UnsupportedEncodingException {scanPackage(basePackage);}/*** 1. 扫描包,扫描需要被创建的类,创建 Bean 定义对象,并放入 Bean 定义Map中*/public void scanPackage(String basePackage) throws UnsupportedEncodingException {
//        String basePackage = "com.shao";// 获取类加载器ClassLoader classLoader = this.getClass().getClassLoader();// 获取包路径String path = classLoader.getResource(basePackage.replace(".", "/")).getPath();// 路径解码,如果路径有空格或者中文,会出现 16 进制的字符String packagePath = URLDecoder.decode(path, "UTF-8");// 创建文件对象File fileDir = new File(packagePath);// 获取包下的文件列表File[] files = fileDir.listFiles();for (File file : files) {if (file.isFile()) {// 判断是否是class文件if (file.getName().endsWith(".class")) {// 包路径 + 文件名 构成全类名String className = basePackage + "." + file.getName().replace(".class", "");try {// 动态加载了名为 className 的类,获取该类的 Class 对象Class<?> aClass = Class.forName(className);// 判断该类是否有 @Service 或 @Controller 注解if (aClass.isAnnotationPresent(Service.class) ||aClass.isAnnotationPresent(Controller.class)) {System.out.println("需要创建:" + className);// 将该类的类名首字母小写作为 idString id = aClass.getSimpleName().substring(0, 1).toLowerCase() + aClass.getSimpleName().substring(1);System.out.println("id:" + id);// 创建 Bean 定义对象,并放入 Bean 定义Map中beanDefinitionMap.put(id, new BeanDefinition(id, className));}} catch (ClassNotFoundException e) {e.printStackTrace();}}} else if (file.isDirectory()) {// 递归扫描子文件夹String subPackagePath = basePackage + "." + file.getName();scanPackage(subPackagePath);}}}
}

4. 使用自定义注解

5. 在 Servlet 中初始化 IOC 对象

这里为了方便测试,所以先在 Servlet 中初始化 IOC 

6. 测试

3. 实例化 Bean 

遍历 Bean 定义Map ,取出 Bean 定义对象,根据对象的信息使用反射技术创建 Bean 对象,这个时候这个 Bean 也叫裸Bean,然后存入 Bean Map 中。这一步在 Bean 的生命周期中属于 Bean 的实例化

package com.shao.IOC;import com.shao.Annotation.Controller;
import com.shao.Annotation.Service;import java.io.File;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;/*** ApplicationContext 类. 当作 IOC 容器** @author shao.*/
public class ApplicationContext {/*** Bean 定义Map   存储Bean 定义对象*/private HashMap<String, BeanDefinition> beanDefinitionMap = new HashMap<>();/*** Bean 实例Map 存储Bean 实例对象*/private HashMap<String, Object> BeanMap = new HashMap<>();public ApplicationContext(String basePackage) throws UnsupportedEncodingException {scanPackage(basePackage);createBean();}/*** 1. 扫描包,扫描需要被创建的类,创建 Bean 定义对象,并放入 Bean 定义Map中*/public void scanPackage(String basePackage) throws UnsupportedEncodingException {// 获取类加载器ClassLoader classLoader = this.getClass().getClassLoader();// 获取包路径String path = classLoader.getResource(basePackage.replace(".", "/")).getPath();// 路径解码,如果路径有空格或者中文,会出现 16 进制的字符String packagePath = URLDecoder.decode(path, "UTF-8");// 创建文件对象File fileDir = new File(packagePath);// 获取包下的文件列表File[] files = fileDir.listFiles();for (File file : files) {if (file.isFile()) {// 判断是否是class文件if (file.getName().endsWith(".class")) {// 包路径 + 文件名 构成全类名String className = basePackage + "." + file.getName().replace(".class", "");try {// 动态加载了名为 className 的类,获取该类的 Class 对象Class<?> aClass = Class.forName(className);// 判断该类是否有 @Service 或 @Controller 注解if (aClass.isAnnotationPresent(Service.class) ||aClass.isAnnotationPresent(Controller.class)) {System.out.println("需要创建:" + className);// 将该类的类名首字母小写作为 idString id = aClass.getSimpleName().substring(0, 1).toLowerCase() + aClass.getSimpleName().substring(1);System.out.println("id:" + id);// 创建 Bean 定义对象,并放入 Bean 定义Map中beanDefinitionMap.put(id, new BeanDefinition(id, className));}} catch (ClassNotFoundException e) {e.printStackTrace();}}} else if (file.isDirectory()) {// 递归扫描子文件夹String subPackagePath = basePackage + "." + file.getName();scanPackage(subPackagePath);}}}/*** 2. 创建 Bean 实例,并放入 Bean Map 中*/public void createBean() {// 获取 Bean 定义 Map 的 所有 idSet<String> ids = beanDefinitionMap.keySet();Iterator<String> it = ids.iterator();while (it.hasNext()) {String id = it.next();// 获取 Bean 定义对象BeanDefinition beanDefinition = beanDefinitionMap.get(id);// 获取 Bean 定义对象中的 Bean 的全类名String className = beanDefinition.getClassName();try {// 动态加载类,并创建 Bean 实例,这时候的 Bean 是裸BeanObject bean = Class.forName(className).newInstance();// 将 Bean 实例放到 Bean Map 中BeanMap.put(id, bean);} catch (Exception e) {e.printStackTrace();}}System.out.println("实例化 Bean 完成");System.out.println(BeanMap);}
}

测试

4. 设置属性

给Bean 对象做初始化,也就是依赖注入。Bean 的生命周期中属于 Bean 的初始化

这里是使用类作为属性进行依赖注入,不是接口,后续需要优化

1. 创建一个Controller

使用 @Autowired 注解,这里为了方便测试,重写一下 toString 方法

2. 属性赋值
package com.shao.IOC;import com.shao.Annotation.Autowired;
import com.shao.Annotation.Controller;
import com.shao.Annotation.Service;import java.io.File;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Field;
import java.net.URLDecoder;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;/*** ApplicationContext 类. 当作 IOC 容器** @author shao.*/
public class ApplicationContext {/*** Bean 定义Map   存储Bean 定义对象*/private HashMap<String, BeanDefinition> beanDefinitionMap = new HashMap<>();/*** Bean 实例Map 存储Bean 实例对象*/private HashMap<String, Object> BeanMap = new HashMap<>();public ApplicationContext(String basePackage) throws UnsupportedEncodingException {scanPackage(basePackage);createBean();injectBean();}/*** 1. 扫描包,扫描需要被创建的类,创建 Bean 定义对象,并放入 Bean 定义Map中*/public void scanPackage(String basePackage) throws UnsupportedEncodingException {// 获取类加载器ClassLoader classLoader = this.getClass().getClassLoader();// 获取包路径String path = classLoader.getResource(basePackage.replace(".", "/")).getPath();// 路径解码,如果路径有空格或者中文,会出现 16 进制的字符String packagePath = URLDecoder.decode(path, "UTF-8");// 创建文件对象File fileDir = new File(packagePath);// 获取包下的文件列表File[] files = fileDir.listFiles();for (File file : files) {if (file.isFile()) {// 判断是否是class文件if (file.getName().endsWith(".class")) {// 包路径 + 文件名 构成全类名String className = basePackage + "." + file.getName().replace(".class", "");try {// 动态加载了名为 className 的类,获取该类的 Class 对象Class<?> aClass = Class.forName(className);// 判断该类是否有 @Service 或 @Controller 注解if (aClass.isAnnotationPresent(Service.class) ||aClass.isAnnotationPresent(Controller.class)) {System.out.println("需要创建:" + className);// 将该类的类名首字母小写作为 idString id = aClass.getSimpleName().substring(0, 1).toLowerCase() + aClass.getSimpleName().substring(1);System.out.println("id:" + id);// 创建 Bean 定义对象,并放入 Bean 定义Map中beanDefinitionMap.put(id, new BeanDefinition(id, className));}} catch (ClassNotFoundException e) {e.printStackTrace();}}} else if (file.isDirectory()) {// 递归扫描子文件夹String subPackagePath = basePackage + "." + file.getName();scanPackage(subPackagePath);}}}/*** 2. 创建 Bean 实例,并放入 Bean Map 中*/public void createBean() {// 获取 Bean 定义 Map 的 所有 idSet<String> ids = beanDefinitionMap.keySet();Iterator<String> it = ids.iterator();while (it.hasNext()) {String id = it.next();// 获取 Bean 定义对象BeanDefinition beanDefinition = beanDefinitionMap.get(id);// 获取 Bean 定义对象中的 Bean 的全类名String className = beanDefinition.getClassName();try {// 动态加载类,并创建 Bean 实例,这时候的 Bean 是裸BeanObject bean = Class.forName(className).newInstance();// 将 Bean 实例放到 Bean Map 中BeanMap.put(id, bean);} catch (Exception e) {e.printStackTrace();}}System.out.println("实例化 Bean 完成");System.out.println(BeanMap);}/*** 3. 给 Bean 设置属性,Autowired 赋值*/public void injectBean() {// 获取 Bean Map 的 所有 idIterator<String> it = BeanMap.keySet().iterator();while (it.hasNext()) {String id = it.next();// 获取 Bean 实例Object bean = BeanMap.get(id);// 获取 Bean 的 Class 对象Class<?> aClass = bean.getClass();// 获取这个类的所有属性,不包括父类的属性Field[] declaredFields = aClass.getDeclaredFields();for (Field field : declaredFields) {// 判断该属性是否有 @Autowired 注解if (field.isAnnotationPresent(Autowired.class)) {// 设置属性可访问field.setAccessible(true);try {// 给属性赋值field.set(bean, BeanMap.get(field.getName()));} catch (IllegalAccessException e) {e.printStackTrace();}}}}System.out.println("属性赋值完成");System.out.println(BeanMap);}
}

3. 测试

四、使用 Bean

1. 创建获取 Bean 的方法

要使用 Bean ,需要从IOC 容器中获取 Bean,所以还需要在 IOC 容器中提供获取 Bean 的接口

package com.shao.IOC;import com.shao.Annotation.Autowired;
import com.shao.Annotation.Controller;
import com.shao.Annotation.Service;import java.io.File;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.net.URLDecoder;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;/*** ApplicationContext 类. 当作 IOC 容器** @author shao.*/
public class ApplicationContext {/*** Bean 定义Map   存储Bean 定义对象*/private HashMap<String, BeanDefinition> beanDefinitionMap = new HashMap<>();/*** Bean 实例Map 存储Bean 实例对象*/private HashMap<String, Object> BeanMap = new HashMap<>();public ApplicationContext(String basePackage) throws UnsupportedEncodingException {scanPackage(basePackage);createBean();injectBean();}/*** 1. 扫描包,扫描需要被创建的类,创建 Bean 定义对象,并放入 Bean 定义Map中*/public void scanPackage(String basePackage) throws UnsupportedEncodingException {// 获取类加载器ClassLoader classLoader = this.getClass().getClassLoader();// 获取包路径String path = classLoader.getResource(basePackage.replace(".", "/")).getPath();// 路径解码,如果路径有空格或者中文,会出现 16 进制的字符String packagePath = URLDecoder.decode(path, "UTF-8");// 创建文件对象File fileDir = new File(packagePath);// 获取包下的文件列表File[] files = fileDir.listFiles();for (File file : files) {if (file.isFile()) {// 判断是否是class文件if (file.getName().endsWith(".class")) {// 包路径 + 文件名 构成全类名String className = basePackage + "." + file.getName().replace(".class", "");try {// 动态加载了名为 className 的类,获取该类的 Class 对象Class<?> aClass = Class.forName(className);// 判断该类是否有 @Service 或 @Controller 注解if (aClass.isAnnotationPresent(Service.class) ||aClass.isAnnotationPresent(Controller.class)) {System.out.println("需要创建:" + className);// 将该类的类名首字母小写作为 idString id = aClass.getSimpleName().substring(0, 1).toLowerCase() + aClass.getSimpleName().substring(1);System.out.println("id:" + id);// 创建 Bean 定义对象,并放入 Bean 定义Map中beanDefinitionMap.put(id, new BeanDefinition(id, className));}} catch (ClassNotFoundException e) {e.printStackTrace();}}} else if (file.isDirectory()) {// 递归扫描子文件夹String subPackagePath = basePackage + "." + file.getName();scanPackage(subPackagePath);}}}/*** 2. 创建 Bean 实例,并放入 Bean Map 中*/public void createBean() {// 获取 Bean 定义 Map 的 所有 idSet<String> ids = beanDefinitionMap.keySet();Iterator<String> it = ids.iterator();while (it.hasNext()) {String id = it.next();// 获取 Bean 定义对象BeanDefinition beanDefinition = beanDefinitionMap.get(id);// 获取 Bean 定义对象中的 Bean 的全类名String className = beanDefinition.getClassName();try {// 动态加载类,并创建 Bean 实例,这时候的 Bean 是裸BeanObject bean = Class.forName(className).newInstance();// 将 Bean 实例放到 Bean Map 中BeanMap.put(id, bean);} catch (Exception e) {e.printStackTrace();}}System.out.println("实例化 Bean 完成");System.out.println(BeanMap);}/*** 3. 给 Bean 设置属性,Autowired 赋值*/public void injectBean() {// 获取 Bean Map 的 所有 idIterator<String> it = BeanMap.keySet().iterator();while (it.hasNext()) {String id = it.next();// 获取 Bean 实例Object bean = BeanMap.get(id);// 获取 Bean 的 Class 对象Class<?> aClass = bean.getClass();// 获取这个类的所有属性,不包括父类的属性Field[] declaredFields = aClass.getDeclaredFields();for (Field field : declaredFields) {// 判断该属性是否有 @Autowired 注解if (field.isAnnotationPresent(Autowired.class)) {// 设置属性可访问field.setAccessible(true);try {// 给属性赋值field.set(bean, BeanMap.get(field.getName()));} catch (IllegalAccessException e) {e.printStackTrace();}}}}System.out.println("属性赋值完成");System.out.println(BeanMap);}/*** 对外提供获取 Bean 的接口*/public Object GetBean(String id) {return BeanMap.get(id);}public <T> T GetBean(Class<T> clazz) {// 获取类名,首字母小写String id = clazz.getSimpleName().substring(0, 1).toLowerCase() + clazz.getSimpleName().substring(1);// 获取 Bean 实例Object value = BeanMap.get(id);// 判断 value 是否为 clazz 类型if (clazz.isInstance(value)) {// 安全的转换类型return clazz.cast(value);} else {return null;}}
}

2. 使用 Bean 

这里为了方便测试,在Servlet 中获取 Bean,然后调用 Bean 实例的方法

3. 测试

五、优化 IOC 容器

现在需要注入依赖的属性是类,不是接口,需要改成给接口赋值其 实现类的对象

http://www.sczhlp.com/news/35374/

相关文章:

  • 深圳怎么做网站外链网站推荐几个
  • 河南怎么样做网站周口网站建设公司
  • 芜湖哪些公司做公司网站讯展网站优化推广
  • 网站栏目及内容网站seo培训
  • 重庆做的好的房产网站好百度网盘优化
  • 做收藏品的网站长沙seo优化哪家好
  • 如何用frontpage做网站长春百度seo排名
  • 做商城网站那个好怎么在百度上发布广告
  • 高新园区规划建设局网站百度帐号登录入口
  • 网站文件怎么做网络营销推广的要点
  • 高端开发网站哪家专业百度热搜榜历史
  • 代理做网站的合同十大营销策划公司排名
  • 网站开发入股合作分配比例网店推广有哪些
  • 线上平台怎么推广广州关键词优化外包
  • 网站插件代码大全武汉网站推广
  • 团购网站 备案问题seo关键词排名优化方法
  • 怎么做能打不开漫画网站网站点击排名优化
  • 北京通信管理局网站备案处营销活动推广策划
  • 机加工网站全国疫情高峰感染进度查询
  • 成都专业网站建设百度一下百度搜索官网
  • wordpress手机端主题插件下载失败洛阳seo网站
  • 瑞安 网站建设培训网站怎么才能被百度收录
  • 广州h5网站开发竞价
  • 插画素材网站有哪些百度首页 百度一下
  • 给国外做网站怎样申请网站
  • 网站建设对图片有哪些要求优化网站排名费用
  • 邢台 网站建设手机百度网址大全首页
  • 做鸭加盟最火的网站百度地图关键词优化
  • 帮别人做网站服务器如何做企业网页
  • 做网站的哪家比较好宁德市政府