1、Spring 框架核心源码
1、使用 Spring 框架
2、反射机制
IoC 控制反转 Inverse of Control 创建对象的权限,Java 程序中需要用到的对象不再由程序员自己创建,而是交给 IoC 容器来创建。
2、IoC 核心思想
1、pom.xml
<dependencies>
<!-- 引入 Servlet 依赖 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
</dependency>
</dependencies>
<!-- 设置 Maven 的JDK版本,默认是5,需要手动改到8 -->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
<packaging>war</packaging>
2、创建 Servlet
package com.htl.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("Spring");
}
}
3、部署到 Tomcat
4、Servlet、Service、Dao
当需求发生变更的时候,可能需要频繁修改 Java 代码,效率很低,如何解决?
静态工厂
package com.htl.factory;
import com.htl.dao.HelloDao;
import com.htl.dao.impl.HelloDaoImpl;
public class BeanFactory {
public static HelloDao getDao(){
return new HelloDaoImpl();
}
}
private HelloDao helloDao = BeanFactory.getDao();
上述的方式并不能解决我们的问题,需求发生改变的时候,仍然需要修改代码,怎么做到
不改 Java 代码,就可以实现实现类的切换呢?
外部配置文件的方式
将具体的实现类写到配置文件中,Java 程序只需要读取配置文件即可。
XML、YAML、Properties、JSON
1、定义外部配置文件
helloDao=com.htl.dao.impl.HelloDaoImpl
2、Java 程序读取这个配置文件
package com.htl.factory;
import com.htl.dao.HelloDao;
import com.htl.dao.impl.HelloDaoImpl;
import com.htl.dao.impl.HelloDaoImpl2;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Properties;
public class BeanFactory {
private static Properties properties;
static {
properties = new Properties();
try {
properties.load(BeanFactory.class.getClassLoader().getResourceAsStream("factory.properties"));
} catch (IOException e) {
e.printStackTrace();
}
}
public static Object getDao(){
String value = properties.getProperty("helloDao");
//反射机制创建对象
try {
Class clazz = Class.forName(value);
Object object = clazz.getConstructor(null).newInstance(null);
return object;
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
}
return null;
}
}
3、修改 Service
private HelloDao helloDao = (HelloDao) BeanFactory.getDao();
Spring IoC 中的 bean 是单例
package com.htl.factory;
import com.htl.dao.HelloDao;
import com.htl.dao.impl.HelloDaoImpl;
import com.htl.dao.impl.HelloDaoImpl2;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
public class BeanFactory {
private static Properties properties;
private static Map<String,Object> cache = new HashMap<>();
static {
properties = new Properties();
try {
properties.load(BeanFactory.class.getClassLoader().getResourceAsStream("factory.properties"));
} catch (IOException e) {
e