


package com.zou.dao.impl;
import com.zou.dao.UserDao;
public class UserDaoImpl1 implements UserDao {
public String findUser() {
// todo 数据库请求获取用户名
return "从数据库admin表中取出来的张海航";
}
}

package com.zou.controller;
import com.zou.dao.UserDao;
import com.zou.dao.impl.UserDaoImpl;
import com.zou.dao.impl.UserDaoImpl1;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
//http://localhost:8080/JavaWeb_war/MyServlet
@WebServlet(name = "MyServlet", value = "/MyServlet")
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 输出html语句
// response.getWriter().println("Hello World MyServlet!
");
// 通过Servlet转发jsp页面
// jsp页面负责html网页相关的,Servlet负责请求java逻辑相关的代码
// todo 从数据库中请求用户名的数据库
// Java JDBC连接数据库步骤
// 1.打开数据库连接 2.SQL语句请求数据库得到数据 3.数据处理封装 4.关闭数据库
// 单一职责原则:一个类不能太累了
// 新建一个包,把所有与数据库操作有关的放到这个包下
// 每一个模块需要一个接口+一个实现类
// 里氏替换原则->java设计模式
// 开闭原则
// 不修改MyServlet任何代码
// 1.把创建的类名写到配置文件(xml/properties)中
// 2.从配置文件中读类的名字
// 3.代码动态的把读到的类名的对象创建出来->反射
UserDao userdao=new UserDaoImpl1();
String name="从数据库中取出来的testName";
request.setAttribute("name",userdao.findUser());
request.getRequestDispatcher("index.jsp").forward(request,response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}

那我们能不能不修改MyServlet任何代码也实现上面的功能呢
方法
1.把创建的类名写到配置文件(xml/properties)中
2.从配置文件中读类的名字
3.代码动态的把读到的类名的对象创建出来->反射








1.开闭原则,不修改MyServlet任何代码
2.把创建的类名写到配置文件(xml/properties)中
3.从配置文件中读类的名字
4.代码动态的把读到的类名的对象创建出来->反射 JavaEE设计模式
5.Spring->IOC(控制反转)->解耦
控制反转:在使用Spring框架之后,对象的实例不再由调用者来创建,而是由Spring容器来创建,Spring容器负责控制程序之间的关系,而不是由调用者的程序代码直接控制。这样,控制权由应用代码转移到了Spring容器,控制权发生了反转,这就是控制反转。





<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-contextartifactId>
<version>5.3.22version>
dependency>


























package org.example.service;
import org.example.dao.UserDao;
import org.example.dao.impl.UserDaoImpl;
public class UserService {
UserDao userDao=new UserDaoImpl();
public String findUser() {
// todo 数据库请求获取用户名
return userDao.findUser();
}
}

UserService userService=new UserService();
System.out.println(userService.findUser());


<bean class="org.example.service.UserService" id="userService">
bean>

UserService userService=(UserService) applicationContext.getBean("userService");
System.out.println(userService.findUser());





package org.example.service;
import org.example.dao.UserDao;
import org.example.dao.impl.UserDaoImpl;
public class UserService {
UserDao userDao;
public UserDao getUserDao() {
return userDao;
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public String findUser() {
// todo 数据库请求获取用户名
return userDao.findUser();
}
}

package org.example;
import org.example.dao.UserDao;
import org.example.dao.impl.UserDaoImpl;
import org.example.dao.impl.UserDaoImpl1;
import org.example.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* Hello world!
*
*/
public class App
{
public static void main( String[] args )
// 开闭原则
// 不修改App任何代码
// 1.把创建的类名写到配置文件(xml/properties)中
// 2.从配置文件中读类的名字
// 3.代码动态的把读到的类名的对象创建出来->反射 JavaEE设计模式
// Spring->IOC(控制反转)->解耦
// 引入Spring依赖包
{
// UserDao userDao1=new UserDaoImpl();
// UserDao userDao2=new UserDaoImpl();
// System.out.println(userDao1==userDao2);
// System.out.println( "Hello World!" );
ApplicationContext applicationContext= new ClassPathXmlApplicationContext("applicationContext.xml");
// UserDaoImpl userDao = (UserDaoImpl) applicationContext.getBean("userDao");
// 里氏替换原则->用UserDaoImpl的接口,也就是父类UserDao来取
UserDao userDao = (UserDao) applicationContext.getBean("userDao");
// UserDao userDao1 = (UserDao) applicationContext.getBean("userDao");
// System.out.println(userDao==userDao1);
// UserService userService=new UserService();
// System.out.println(userService.findUser());
// 用set方法对userService变量赋值
UserService userService=(UserService) applicationContext.getBean("userService");
userService.setUserDao(userDao);
System.out.println(userService.findUser());
}
}

依赖注入(DI):从Spring容器角度来看,Spring容器负责将被依赖的对象赋值给调用者的成员变量,相当于为调用者注入它所依赖的实例,这就是Spring的依赖注入。








package org.example.pojo;
public class Person {
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}

<bean class="org.example.pojo.Person" id="person">
bean>

Person person=(Person) applicationContext.getBean("person");
person.setAge(20);
person.setName("哈哈哈");
System.out.println(person.getAge());
System.out.println(person.getName());


<bean class="org.example.pojo.Person" id="person">
<property name="name" value="哈哈哈"/>
<property name="age" value="20"/>
bean>




package org.example.pojo;
import org.springframework.stereotype.Component;
//@Component Spring创建对象 id=person
//@Component默认不生效
@Component
public class Person {
private int age;
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="org.example"/>
beans>


package org.example.pojo;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
//@Component Spring创建对象 id=person
//@Component默认不生效
@Component
public class Person {
@Value("20")
private int age;
@Value("哈哈哈")
private String name;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}

@Component->其他层
@Service->Service层
@Repository->dao层
@Controller->Controller层


package org.example.dao.impl;
import org.example.dao.UserDao;
import org.springframework.stereotype.Repository;
@Repository
public class UserDaoImpl implements UserDao {
public String findUser() {
// todo 数据库请求获取用户名
String name="从数据库中取出来的testName1111";
return name;
}
}

package org.example.dao.impl;
//import com.zou.dao.UserDao;
import org.example.dao.UserDao;
import org.springframework.stereotype.Repository;
@Repository
public class UserDaoImpl1 implements UserDao {
public String findUser() {
// todo 数据库请求获取用户名
return "从数据库admin表中取出来的张海航";
}
}






package org.example.service;
import org.example.dao.UserDao;
import org.example.dao.impl.UserDaoImpl1;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;
@Service
public class UserService {
// Autowired 自动注入
// Autowired 替换set和get方法
@Autowired
UserDao userDaoImapl1;
//
// public UserDao getUserDao() {
// return userDao;
// }
//
// public void setUserDao(UserDao userDao) {
// this.userDao = userDao;
// }
public String findUser() {
// todo 数据库请求获取用户名
return userDaoImapl1.findUser();
}
}