Spring1(初始Spring 解耦实现 SpringIOC SpringDI Spring常见面试题)

Spring1

  • 创建项目
    • 集成maven
    • 创建一个Maven项目
    • 实现:
  • 初识Spring
    • Spring简介
    • Spring的发展历史
    • Spring之父
    • 体系结构
    • 生态系统
    • 官方文档
    • 解耦实现
      • JDBC
      • SpringBoot整合MyBatis和lombok,开启驼峰映射
      • 三层思想
  • SpringIOC
    • 实现
  • SpringDI
    • set注入
      • 全部代码:
      • 实现:set注入基本数据类型与String
      • 实现:set注入javabean对象
      • 实现:set注入复杂类型
    • 构造注入:
      • 全部代码:
      • 实现:构造注入基本类型与String类型
      • 实现:构造注入javabean对象
  • Spring常见面试题
    • Spring 框架的基本理解
    • Spring 框架由哪些模块组成?
    • Spring IOC的理解
    • Spring IOC容器的理解
    • Spring DI的理解

创建项目

集成maven

创建一个Maven项目

实现:

在pom配置依赖:

初识Spring

Spring简介

Spring是分层的轻量级开源框架,以IoC[反转控制]和AoP[面向切面编程]为内核,提供了展现层SpringMVC和持久层SpringJDBC以及业务层的事务管理。

Spring 是分层的 Java SE/EE 应⽤ full-stack 轻量级开源框架,以IoC(Inverse Of Control:反转控制)和AOP(Aspect Oriented Programming:面向切⾯编程)为内核,提供了展现层 Spring MVC 和持久层 Spring JDBC 以及业务层事务管理等众多的企业级应⽤技术,还能整合开源世界众多著名的第三⽅框架和类库,逐渐成为使⽤最多的 Java EE 企业应⽤开源框架。

官方网站:https://spring.io/

Spring的发展历史

企业级应用指的是 大规模、性能和安全要求高、业务复杂、灵活多变 的大型 WEB 应用程序。

  • 大规模:用户量和 IP/PV访问量大、海量数据、功能模块多代码量大。
  • 业务复杂:涉及金融、期货、电信等特殊领域的业务逻辑复杂,对系统架构提出新要求。
  • 性能和安全要求高:响应毫秒数和安全级别均有很高的要求。
  • 灵活多变:经常性的业务变更,也对开发效率以及项目部署等工作有更高的要求。

重量级技术向轻量级开发过度

为了实现企业级应用开发各类需求,涌现出以EJB为代表的一系列技术。

Spring之父

Rod Johnson,SpringFramework创始人, interface21 CEO。

• 1996 年开始关注 Java 服务器端技术

• Servlet2.4 和 JDO2.0 专家组成员

• Expert One-to-One J2EE Design and Development(2002)

• 阐述了 J2EE 使用EJB 开发设计的优点及解决方案

• Expert One-to-One J2EE Development without EJB(2004)

• 阐述了 J2EE 开发不使用 EJB的解决方式(Spring 雏形 )

• 2004年3月24日发布了Spring Framework 1.0 final

技术主张:技术应当回归实用为主,简化 Java 开发

Spring的理论基础:Spring 框架建立在本书中对于J2EE企业级应用的开发与设计的核心理念之上,追求简洁、轻量级的开发方式,让系统具备更好的健壮性和可扩展性。

体系结构

  • Spring Core:Spring框架的最基础部分,提供DI(依赖注入)特性。
  • Spring Context:Spring上下文,提供Bean容器的集合。
  • Spring AOP:基于Spring Core的符合规范的切面编程的实现。
  • Spring JDBC:提供了JDBC的抽象层,简化了JDBC编码。
  • Spring ORM:对主流ORM框架(Hibernate、Toplink等)进行集成。
  • Spring Web:为Spring在Web应用程序中的使用提供了支持。

生态系统

  • Spring Boot:简化产品级的 Spring 应用和服务的创建,简化了配置文件,使用嵌入式web服务器,含有诸多开箱即用微服务功能。
  • Spring Data:是一个数据访问及操作的工具包,封装了很多种数据及数据库的访问相关技术,包括:jdbc、Redis、MongoDB、Neo4j等。
  • Spring AMQP:消息队列操作的工具包,主要是封装了RabbitMQ的操作。
  • Spring Cloud:微服务工具包,用于创建基于云计算架构的原生微服务应用。
  • Spring Security:是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。
  • Spring Mobile:是Spring MVC的扩展,用来简化手机上的Web应用开发。

Spring【Spring FrameWork】解决的问题:

官方文档

Spring文档:https://docs.spring.io/spring-framework/docs/5.2.25.RELEASE/spring-framework-reference/core.html#spring-core

解耦实现

Spring的两大核心思想:IOC和AOP

  • SpringIOC(控制反转)SpringDI(依赖注入)
  • SpringAOP(面向切面思想)

SpringIOC:SpringIOC容器扮演项目的载体,IOC容器是可以使项目更符合高内聚,低耦合的思想“解耦”

耦合:类与类之间有耦合,方法与方法有耦合

解耦:

  • 尽量避免new对象,通过反射实例化
  • 需要创建的对象不要写死,而是把类名保存在独立的Properties文件中按需加载

JDBC

package com.stringzhua;import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;/*** @Author Stringzhua* @Date 2024/9/9 19:30* description:*/
class Test01 {public static void main(String[] args) {try {Class.forName("com.mysql.cj.jdbc.Driver");Connection root = DriverManager.getConnection("jdbc:mysql://localhost:3306/lmonkeyshop?serverTimezone=GMT", "root", "12345678");System.out.println(root);} catch (ClassNotFoundException exception) {exception.printStackTrace();} catch (SQLException throwables) {throwables.printStackTrace();}}
}

SpringBoot整合MyBatis和lombok,开启驼峰映射

=================mybaits自动驼峰映射====================
JavaBean                DB
stuId                   stu_id
stuName                 stu_name
<!--自动驼峰映射-->
<settings><setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>=================junit====================
含义:方法级别的单元测试工具
步骤:1.坐标2.注解@Test=============main@Before===========main执行之前@After============main执行之后=================lombok====================
步骤:1.idea安装插件(只安装一次)2.坐标3.注解

项目结构如下:
在这里插入图片描述

Dao层:

StudentMapper.java

package com.stringzhua.dao;import com.stringzhua.pojo.Student;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;import java.util.List;/*** @Author Stringzhua* @Date 2024/9/9 16:08* description:mybatis 的 mapper*/
public interface StudentMapper {@Select("select * from student")public List<Student> findAll();@Insert("insert into student(stu_name,nick_name,stu_age) values (#{stuName},#{nickName},#{stuAge})")public void add(Student s);
}

mybatis.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!--自动驼峰映射--><settings><setting name="mapUnderscoreToCamelCase" value="true"/></settings><!--开发模式--><environments default="env"><environment id="env"><transactionManager type="JDBC"></transactionManager><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/mavendb?serverTimezone=Asia/Shanghai"/><property name="username" value="root"/><property name="password" value="12345678"/></dataSource></environment></environments><!--映射器注册--><mappers><package name="com.stringzhua.dao"/></mappers></configuration>

POJO层:

Stundet.java

package com.stringzhua.pojo;import lombok.*;import java.io.Serializable;/*** @Author Stringzhua* @Date 2024/9/9 16:03* description:*//*** @AllArgsConstructor 满参构造* @NoArgsConstructor 无参构造* @ToString toString方法* @Getter getter方法* @Setter setter方法* @Data 提供类的get、set、equals、hashCode、canEqual、toString方法** canEqual* 除非您的类 isfinal和 extends java.lang.Object,* 否则 lombok 会生成一个canEqual方法,这意味着 JPA 代理* 仍然可以等于它们的基类,但是添加新状态的子类不会破坏 equals 契约。*/@NoArgsConstructor
@Data
public class Student implements Serializable {private int stuId;private String stuName;private String nickName;private int stuAge;public Student(String stuName, String nickName, int stuAge) {this.stuName = stuName;this.nickName = nickName;this.stuAge = stuAge;}
}

单元测试:

package com.stringzhua.test;import com.stringzhua.pojo.Student;
import com.stringzhua.dao.StudentMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;import java.io.IOException;
import java.io.InputStream;
import java.util.List;/*** @Author Stringzhua* @Date 2024/9/9 16:14* description:* @Before 指的是@Test注解运行之前要执行的方法* @Test 指的是要执行测试的方法* @After 指的是@Test注解运行之后执行的方法*/
public class Test01 {SqlSession sqlSession = null;StudentMapper studentmapper = null;@Beforepublic void beforeMethod() {try {InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();SqlSessionFactory factory = sqlSessionFactoryBuilder.build(inputStream);sqlSession = factory.openSession(true);studentmapper = sqlSession.getMapper(StudentMapper.class);} catch (IOException e) {e.printStackTrace();}}@Afterpublic void afterMethod() {sqlSession.close();}@Testpublic void show1() throws Exception {studentmapper.add(new Student("猫猫", "千逐", 18));studentmapper.add(new Student("田欣怡", "晞苒", 22));}@Testpublic void show2() throws Exception {List<Student> all = studentmapper.findAll();for (int i = 0; i < all.size(); i++) {Student student = all.get(i);System.out.println(student);}}
}

三层思想

项目结构如下:

首先需要在main—>resources下新建一个properties配置文件

service=com.stringzhua.service.UserServiceImpl
dao=com.stringzhua.dao.UserDaoImpl

Controller层:

IUserController.java

package com.stringzhua.controller;public interface IUserController {public void save();
}

UserControllerImpl.java

package com.stringzhua.controller;import com.stringzhua.service.IUserService;
import com.stringzhua.util.BeansFactory;public class UserControllerImpl implements IUserController {//耦合度高
//    IUserService service = new UserServiceImp();//耦合度低,通过工厂创建service对象IUserService service = (IUserService) BeansFactory.getBean("service");public void save() {System.out.println("===controller的新增===");service.save();}
}

Dao层:

IUserDao.java

package com.stringzhua.dao;public interface IUserDao {public void save();
}

UserDaoImpl.java

package com.stringzhua.dao;public class UserDaoImpl implements IUserDao{public void save() {System.out.println("===dao的新增===");}
}

Service层:

IUserService.java

package com.stringzhua.service;public interface IUserService {public void save();
}

UserServiceImpl.java

package com.stringzhua.service;import com.stringzhua.dao.IUserDao;
import com.stringzhua.util.BeansFactory;public class UserServiceImpl implements IUserService{//耦合度高
//    IUserDao dao = new UserDaoImp();//耦合度低,通过工厂去创建dao对象IUserDao dao = (IUserDao) BeansFactory.getBean("dao");public void save() {System.out.println("===serivce的新增===");dao.save();}
}

Utils工具类:

BeansFactory.java

package com.stringzhua.util;import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;public class BeansFactory {static Properties properties;static {try {//1.工具类properties = new Properties();//2.加载文件InputStream resourceAsStream = BeansFactory.class.getClassLoader().getResourceAsStream("beans.properties");properties.load(resourceAsStream);} catch (IOException e) {e.printStackTrace();}}public static Object getBean(String key) {Object object = null;try {//1.获取key对应的valueString classPath = properties.getProperty(key);//2.创建对象,反射,newInstance()去创建对象object = Class.forName(classPath).newInstance();} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (ClassNotFoundException exception) {exception.printStackTrace();}return object;}
}

测试:

package com.stringzhua.test;import com.stringzhua.controller.IUserController;
import com.stringzhua.controller.UserControllerImpl;public class Test01 {public static void main(String[] args) {IUserController controller = new UserControllerImpl();controller.save();}
}

SpringIOC

Spring环境搭建:

坐标---->配置文件

SpringIOC:控制反转

关键字:IOC名词解释,作用是解耦,使用IOC容器管理项目组件之间的耦合关系

IOC(Inversion Of Control 中文释义:控制反转)是Spring框架的核心思想之一,主要用于解耦。IOC是将创建的对象的控制权交给Spring框架进行管理。由Spring框架根据配置文件或注解等方式,创建Bean对象并管理各个Bean对象之间的依赖关系,使对象之间形成松散耦合的关系,实现解耦。

控制:指的是对象创建(实例化、管理)的权力

反转:控制权交给外部环境(Spring框架、IOC容器)

SpringIOC使用步骤:

  1. 创建类
  2. 将需要Spring管理的类,注入SpringIOC容器
<bean id="唯一标识" class="类的完全限定名称"></bean>
  1. 以解耦的方式获取JavaBean实例对象
    1. 加载Spring主配置文件,获取Spring核心对象
            ApplicationContext applicationContext =  new ClassPathXmlApplicationContext("beans.xml");
2. 获取JavaBean
Student  student = (Student) applicationContext.getBean("student");

实现

在pom.xml中配置:

<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.25</version></dependency>
</dependencies>

项目结构如下图所示:

Controller层:

IUserController.java

package com.stringzhua.controller;/*** @Author Stringzhua* @Date 2024/9/10 14:28* description:*/
public interface IUserController {public void add();
}

UserControllerImpl.java

package com.stringzhua.controller;/*** @Author Stringzhua* @Date 2024/9/10 14:29* description:*/
public class UserControllerImpl implements  IUserController{public void add() {System.out.println("=====controller层的save()====");}
}

Dao层:

IUserDao.java

package com.stringzhua.dao;/*** @Author Stringzhua* @Date 2024/9/10 14:37* description:*/
public interface IUserDao {public void add();
}

UserDaoImpl.java

package com.stringzhua.dao;/*** @Author Stringzhua* @Date 2024/9/10 14:37* description:*/
public class UserDaoImpl implements IUserDao{public void add() {System.out.println("=====dao层的add()====");}
}

POJO层:

Student.java

package com.stringzhua.pojo;/*** @Author Stringzhua* @Date 2024/9/10 14:21* description:*/
public class Student {}

Service层:

IUserService.java

package com.stringzhua.service;/*** @Author Stringzhua* @Date 2024/9/10 14:38* description:*/
public interface IUserService {public void add();
}	

UserServiceImpl.java

package com.stringzhua.service;/*** @Author Stringzhua* @Date 2024/9/10 14:38* description:*/
public class UserServiceImpl implements IUserService{public void add() {System.out.println("=====service层的add()====");}
}

测试类:

package com.stringzhua.test;import com.stringzhua.controller.IUserController;
import com.stringzhua.dao.IUserDao;
import com.stringzhua.pojo.Student;
import com.stringzhua.service.IUserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;import java.util.Date;/*** @Author Stringzhua* @Date 2024/9/10 14:22* description:*/
public class Test01 {public static void main(String[] args) {//1.加载spring主配置文件获取ioc容器对象ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");//2.获取javaBean//默认为Object类型的对象,需要转换类型Student student = (Student) applicationContext.getBean("student");System.out.println(student);IUserController controller = (IUserController) applicationContext.getBean("controller");controller.add();IUserService service = (IUserService) applicationContext.getBean("service");service.add();IUserDao dao = (IUserDao) applicationContext.getBean("dao");dao.add();Date date = (Date) applicationContext.getBean("date");System.out.println(date);}
}

两个Demo的对比:

SpringDI

SpringDI:依赖注入

DI(Dependency Inject,中文释义:依赖注入)

是对IOC概念的不同角度的描述,是指应用程序在运行时,每一个Bean对象都要依赖IOC容器注入当前Bean对象所需要的另外一个Bean对象。

例如:在MyBatis整合Spring时,SqlSessionFactoryBean依赖IOC注入一个DataSource数据源Bean

SpringDI的实现方式:

  • set注入
  • 构造注入
  • 注解注入

SpringDI支持的数据类型:

  • 基本数据类型与String类型
  • JavaBean对象
  • 复杂类型(构造注入不支持)

DI实现步骤:

  1. 思考
  2. 提供对应方法(set) set(XXXXX)
  3. 配置
<property 属性名="属性值"></property>属性:name:属性名ref:注入的值的引用value:注入的值

DI实现步骤 (构造实现):

  1. 思考
  2. 提供对应的构造方法(构造)
  3. 配置
 <constructor-arg 属性名="属性值"></constructor-arg>属性:name:属性名type: 参数类型index: 参数下标ref:注入的值的引用value:注入的值

总结IOC和DI

原来要对象,自己造自己用

现在要对象,容器造,容器拼一块,自己用

“Spring胶水框架”

set注入

在pom.xml中进行配置:

 <dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.25</version>
</dependency>

项目结构:

全部代码:

Controller层:

IUserController.java

package com.stringzhua.controller;/*** @Author Stringzhua* @Date 2024/9/10 16:02* description:*/
public interface IUserController {public void add();
}

UserControllerImpl.java

package com.stringzhua.controller;import com.stringzhua.service.IUserService;/*** @Author Stringzhua* @Date 2024/9/10 16:03* description:*/
public class UserControllerImpl implements IUserController {IUserService service;//di注入步骤1:提供set方法public void setService(IUserService service) {this.service = service;}public void add() {System.out.println("==controller层的add方法==");service.add();}
}

Dao层:

IUserDao.java

package com.stringzhua.dao;/*** @Author Stringzhua* @Date 2024/9/10 15:59* description:*/
public interface IUserDao {public void add();
}
package com.stringzhua.dao;/*** @Author Stringzhua* @Date 2024/9/10 16:00* description:*/
public class UserDaoImpl implements IUserDao{public void add() {System.out.println("=====Dao层的add方法===");}
}

POJO层:

Student.java

package com.stringzhua.pojo;/*** @Author Stringzhua* @Date 2024/9/10 15:54* description:*/
public class Student {private String stuName;private int stuAge;//di步骤1:提供set方法public void setStuName(String stuName) {this.stuName = stuName;}public void setStuAge(int stuAge) {this.stuAge = stuAge;}@Overridepublic String toString() {return "Student{" +"stuName='" + stuName + '\'' +", stuAge=" + stuAge +'}';}
}

Teacher.java

package com.stringzhua.pojo;import java.util.*;/*** @Author Stringzhua* @Date 2024/9/10 17:06* description:*/
public class Teacher {private List mylist;private Set myset;private String[] myarray;private Map mymap;private Properties prop;public void setMylist(List mylist) {this.mylist = mylist;}public void setMyset(Set myset) {this.myset = myset;}public void setMyarray(String[] myarray) {this.myarray = myarray;}public void setMymap(Map mymap) {this.mymap = mymap;}public void setProp(Properties prop) {this.prop = prop;}@Overridepublic String toString() {return "Teacher{" +"mylist=" + mylist +", myset=" + myset +", myarray=" + Arrays.toString(myarray) +", mymap=" + mymap +", prop=" + prop +'}';}
}

Service层:

IUserService.java

package com.stringzhua.service;/*** @Author Stringzhua* @Date 2024/9/10 16:01* description:*/
public interface IUserService {public void add();
}

UserServiceImpl.java

package com.stringzhua.service;import com.stringzhua.dao.IUserDao;/*** @Author Stringzhua* @Date 2024/9/10 16:01* description:*/
public class UserServiceImpl implements IUserService {IUserDao dao;public void setDao(IUserDao dao) {this.dao = dao;}public void add() {System.out.println("==Service层的add方法==");dao.add();}
}

测试类:

Test.java

package com.stringzhua.test;import com.stringzhua.controller.IUserController;
import com.stringzhua.pojo.Student;
import com.stringzhua.pojo.Teacher;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;/*** @Author Stringzhua* @Date 2024/9/10 15:57* description:*/
public class Test01 {public static void main(String[] args) {//1.获取Application对象ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");//2.获取JavaBeanStudent student = (Student) applicationContext.getBean("student");System.out.println(student);IUserController controller = (IUserController) applicationContext.getBean("controllerImpl");controller.add();Teacher teacher = (Teacher) applicationContext.getBean("teacher");System.out.println(teacher);}
}

实现:set注入基本数据类型与String

applicationContext.xml

 <!--    set注入基本数据类型与String--><bean id="student" class="com.stringzhua.pojo.Student"><property name="stuName" value="晞冉"></property><property name="stuAge" value="20"></property></bean>
//1.获取Application对象
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//2.获取JavaBean
Student student = (Student) applicationContext.getBean("student");
System.out.println(student);

实现:set注入javabean对象

applicationContext.xml

 <!--    set注入JavaBean-->
<bean id="daoImpl" class="com.stringzhua.dao.UserDaoImpl"></bean><bean id="serviceImpl" class="com.stringzhua.service.UserServiceImpl"><property name="dao" ref="daoImpl"></property>
</bean><bean id="controllerImpl" class="com.stringzhua.controller.UserControllerImpl"><property name="service" ref="serviceImpl"></property>
</bean>
//1.获取Application对象
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//2.获取JavaBean
IUserController controller = (IUserController) applicationContext.getBean("controllerImpl");
controller.add();

实现:set注入复杂类型

applicationContext.xml

<!--    set注入复杂类型-->
<bean id="teacher" class="com.stringzhua.pojo.Teacher">
<property name="mylist"><list><value>有何不可</value><value>断桥残雪</value><value>千百度</value><value>老古董</value><value>三尺</value></list>
</property><property name="myset"><set><value>田晞冉</value><value>李芸芸</value><value>董万鹏</value><value>高夏斌</value></set>
</property><property name="myarray"><array><value>雁塔区</value><value>莲湖区</value><value>长安区</value><value>长安区</value><value>高新区</value></array>
</property><property name="mymap"><map><entry key="袁继峰" value="男"></entry><entry key="陈博文" value="男"></entry><entry key="郭忠航" value="男"></entry></map>
</property><property name="prop"><props><prop key="王文茜">已毕业</prop><prop key="赵文瑜">未毕业,大四</prop><prop key="张玉婷">文科专业转码</prop></props>
</property>
//1.获取Application对象
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//2.获取JavaBean
Teacher teacher = (Teacher) applicationContext.getBean("teacher");
System.out.println(teacher);

构造注入:

pom.xml

<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.25</version></dependency></dependencies>

项目结构:

全部代码:

Controller层:

IUserController.java

package com.stringzhua.controller;/*** @Author Stringzhua* @Date 2024/9/10 18:00* description:*/
public interface IUserController {public void add();
}

UserControllerImpl.java

package com.stringzhua.controller;import com.stringzhua.service.IUserSerivce;
import com.stringzhua.service.UserServiceImpl;/*** @Author Stringzhua* @Date 2024/9/10 18:01* description:*/
public class UserControllerImpl implements IUserController {IUserSerivce serivce;public UserControllerImpl() {}public UserControllerImpl(IUserSerivce serivce) {this.serivce = serivce;}public void add() {System.out.println("==UserController层的add方法==");serivce.add();}
}

Dao层:

IUser.java

package com.stringzhua.dao;/*** @Author Stringzhua* @Date 2024/9/10 17:57* description:*/
public interface IUserDao {public void add();
}

UserDaoImpl.java

package com.stringzhua.dao;/*** @Author Stringzhua* @Date 2024/9/10 17:58* description:*/
public class UserDaoImpl implements IUserDao {public void add() {System.out.println("==UserDao层的add方法==");}
}

POJO层:

Student.java

package com.stringzhua.pojo;/*** @Author Stringzhua* @Date 2024/9/10 17:50* description:*/
public class Student {private String stuName;private int stuAge;public Student() {}public Student(String stuName, int stuAge) {this.stuName = stuName;this.stuAge = stuAge;}@Overridepublic String toString() {return "Student{" +"stuName='" + stuName + '\'' +", stuAge=" + stuAge +'}';}
}

Service层;

IUserService.java

package com.stringzhua.service;/*** @Author Stringzhua* @Date 2024/9/10 17:59* description:*/
public interface IUserSerivce {public void add();
}

UserServiceImpl.java

package com.stringzhua.service;import com.stringzhua.dao.IUserDao;/*** @Author Stringzhua* @Date 2024/9/10 17:59* description:*/
public class UserServiceImpl implements IUserSerivce {IUserDao dao;public UserServiceImpl() {}public UserServiceImpl(IUserDao dao) {this.dao = dao;}public void add() {System.out.println("==UserSerivce层的add方法==");dao.add();}
}

Test:

test.java

package com.stringzhua.service;import com.stringzhua.dao.IUserDao;/*** @Author Stringzhua* @Date 2024/9/10 17:59* description:*/
public class UserServiceImpl implements IUserSerivce {IUserDao dao;public UserServiceImpl() {}public UserServiceImpl(IUserDao dao) {this.dao = dao;}public void add() {System.out.println("==UserSerivce层的add方法==");dao.add();}
}

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!--    构造注入基本类型与String-->
<!--    <bean id="student" class="com.stringzhua.pojo.Student">-->
<!--        <constructor-arg name="stuName" value="晞冉"></constructor-arg>-->
<!--        <constructor-arg name="stuAge" value="18"></constructor-arg>-->
<!--    </bean>-->
<!--    <bean id="student" class="com.stringzhua.pojo.Student">-->
<!--        <constructor-arg index="0" value="晞冉"></constructor-arg>-->
<!--        <constructor-arg index="1" value="18"></constructor-arg>-->
<!--    </bean>--><bean id="student" class="com.stringzhua.pojo.Student"><constructor-arg type="java.lang.String" value="晞冉"></constructor-arg><constructor-arg type="int" value="18"></constructor-arg></bean><!--    ==构造注入javabean==--><bean id="daoImpl" class="com.stringzhua.dao.UserDaoImpl"></bean><bean id="serviceImpl" class="com.stringzhua.service.UserServiceImpl"><constructor-arg name="dao" ref="daoImpl"></constructor-arg></bean><bean id="controllerImpl" class="com.stringzhua.controller.UserControllerImpl"><constructor-arg name="serivce" ref="serviceImpl"></constructor-arg></bean>
</beans>

实现:构造注入基本类型与String类型

applicationContext.xml

<bean id="student" class="com.stringzhua.pojo.Student"><constructor-arg name="stuName" value="晞冉"></constructor-arg><constructor-arg name="stuAge" value="18"></constructor-arg></bean><bean id="student" class="com.stringzhua.pojo.Student"><constructor-arg index="0" value="晞冉"></constructor-arg><constructor-arg index="1" value="18"></constructor-arg></bean><bean id="student" class="com.stringzhua.pojo.Student"><constructor-arg type="java.lang.String" value="晞冉"></constructor-arg><constructor-arg type="int" value="18"></constructor-arg></bean>

Test.java

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
Student student = (Student) applicationContext.getBean("student");
System.out.println(student);

实现:构造注入javabean对象

applicationContext.xml

<!--    &lt;!&ndash;    ==构造注入javabean==&ndash;&gt;-->
<bean id="daoImpl" class="com.stringzhua.dao.UserDaoImpl"></bean><bean id="serviceImpl" class="com.stringzhua.service.UserServiceImpl"><constructor-arg name="dao" ref="daoImpl"></constructor-arg>
</bean><bean id="controllerImpl" class="com.stringzhua.controller.UserControllerImpl"><constructor-arg name="serivce" ref="serviceImpl"></constructor-arg>
</bean>

Test.java

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
//        Student student = (Student) applicationContext.getBean("student");
//        System.out.println(student);IUserController controller = (IUserController) applicationContext.getBean("controllerImpl");
controller.add();

Spring常见面试题

Spring 框架的基本理解

  • 关键字: 核心思想IOC\AOP、作用(解耦、简化),简单描述框架组成
  • Spring 框架是一款轻量级的开发框架,核心思想是 IOC(控制反转)AOP(面向切面编程) 为java 应用程序开发提供组件管理服务,用于组件之间的解耦,以及简化第三方JavaEE中间件技术的使用(jms、任务调度、缓存、orm 框架),是一个基础架构型的开发框架
  • Spring框架包括: IOC容器、Validation 数据校验、AOP面向切面编程、Transactions 事务管理、SpringJDBC 、Spring MVC框架、以及各类第三方JavaEE 中间件技术集成

Spring 框架由哪些模块组成?

  • 关键字: 官方文档描述,由7个模块组成
  • Spring framwork 根据官方文档的描述,主要包括以下常用5个模块:
    1. Core:核心模块 包括: IoC Container(loc容器),Events(事件通知机制),Resources(资源加载机制),118n(国际化),Validation(数据校验),Data Binding(数据绑定),Type Conversion(类型转换),spEl(spring表达式),AOP(面向切面编程);
    2. Testing:测试模块 包括: Mock Objects(测试模拟对象),TestContext Framework(测试框架),Spring MVC Test(用于测试Spring MVC),WebTestClient(用于测试WebClient 、Restful、Webflux等)
    3. Data Access:数据访问模块 包括:Transactions (事务管理),Dao Support (统一的 Data Access Object DAO 模式封装),jdbc(spring 对于 jdbc 的操作封装),O/R Mapping( spring 对于对象关系映射框架的封装,例如 hibernate 等框架)等;
    4. Web servlet:基于servlet的web应用开发 包括: Spring Mvc( Spring 基于 Mvc 模式设计封装的Web 框架), WebSocket(spring集成 websocket,websocket 是一个服务器与客户端双向通信的技术)等;
    5. Integration:企业级系统集成模块(不同系统之间的交互集成) 包括∶ remoting(spring 用于在分布式系统中进行远程服务调用的通讯框架)

Spring IOC的理解

  • 关键字: IOC 名词解释,作用是解耦,使用IOC容器管理项目组件之间的耦合关系
  • IOCInversion of control,中文释义:控制反转)是 Spring 框架的核心思想之一,主要用于解耦。IOC 是指将创建对象的控制权转移给 Spring 框架进行管理。由spring框架根据配置 文件或注解等方式,创建Bean对象并管理各个 Bean 对象之间的依赖关系。使对象之间形成松散耦合的关系,实现解耦 。
    • 控制:指的是对象创建(实例化、管理)的权力
    • 反转:控制权交给外部环境( Spring 框架、IoC 容器 )

Spring IOC容器的理解

  • 关键字: IOC 容器的作用、存储形式、初始化过程
  • IOC 通常被理解为 IOC Container 容器,IOC 容器其实就是一个 Map,key 是每个bean对象的ID,value 是 bean 对象本身。IOC 容器负责创建 bean 对象并管理 bean 的生命周期。并且根据配置好配置文件或注解,管理 ioc 容器中的每个bean,以及根据bean之间的依赖关系,完成bean之间的注入
  • IOC 容器属于Spring core模块,用来创建和管理bean,默认使用单例的方式将bean存储在 DefaultListableBeanFactory类的beanDefinitionMap中(一个 ConcurrentHashMap 类型的Map集合)
  • IOC 容器使用 ConcurrentHashMap 集合存储了 BeanDefinition 对象,该对象封装了 Spring 对一个 Bean 所有配置信息,包括:类名属性构造方法参数依赖是否延迟加载是否是单例等配置信息

Spring DI的理解

  • DIdependecy inject,中文释义:依赖注入)是对 IOC 概念的不同角度的描述,是指应用程序在运行时,每一个 bean 对象都依赖 IOC 容器注入当前 bean 对象所需要的另外一个 bean 对象。(例如在 mbatis整合 spring 时,SqlSessionFactoryBean 依赖 ioc 容器注入一个 DataSource 数据源 bean )

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/464119.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

服务器新建用户

文章目录 前言一、步骤二、问题三、赋予管理员权限总结 前言 环境&#xff1a; 一、步骤 创建用户需要管理员权限sudo sudo useradd tang为用户设置密码 sudo passwd tang设置密码后&#xff0c;可以尝试使用 su 切换到 tang 用户&#xff0c;确保该用户可以正常使用&#…

leetcode-88-合并两个有序数组

题解&#xff1a; 解法一&#xff1a;从后向前同时遍历两个数组&#xff0c;因为nums1后面是0&#xff0c;从后遍历节省空间。 1、定义三个指针&#xff0c;分别为&#xff1a;len1m-1指向nums1的最后一个非0数字&#xff1b;len2n-1指向nums2的最后一个数字&#xff1b;len3…

操作系统(10) (并发(2)------基于软件/硬件/操作系统层面解决两个进程之间的临界区问题/抢占式/非抢占式内核)

目录 1. 基于软件层面(Petersons Solution) Petersons Solution 满足三个要求: 好处: 缺点 2. 基于硬件层面 1. Disabling Interrupts (禁用中断) 概念解释&#xff1a; 代码框架&#xff1a; 要求&#xff1a; 禁用中断的好处与问题&#xff1a; 2. Test and Set Lock (…

Java | Leetcode Java题解之第526题优美的排列

题目&#xff1a; 题解&#xff1a; class Solution {public int countArrangement(int n) {int[] f new int[1 << n];f[0] 1;for (int mask 1; mask < (1 << n); mask) {int num Integer.bitCount(mask);for (int i 0; i < n; i) {if ((mask & (1…

2024年大厂AI大模型面试题精选与答案解析

前言 随着AI市场&#xff0c;人工智能的爆火&#xff0c;在接下来的金九银十招聘高峰期&#xff0c;各大科技巨头和国有企业将会对AGI人才的争夺展开一场大战&#xff0c;为求职市场注入了新的活力。 为了助力求职者在面试中展现最佳状态&#xff0c;深入理解行业巨头的选拔标…

智能网联汽车:人工智能与汽车行业的深度融合

内容概要 在这个快速发展的时代&#xff0c;智能网联汽车已经不再是科幻电影的专利&#xff0c;它正在悄然走进我们的日常生活。如今&#xff0c;人工智能&#xff08;AI&#xff09;技术与汽车行业的结合犹如一场科技盛宴&#xff0c;让我们看到了未来出行的新方向。通过自动…

AI大模型重塑软件开发:从代码自动生成到智能测试

随着AI技术的不断发展&#xff0c;AI大模型在软件开发领域的应用日益广泛。从代码自动生成到智能测试&#xff0c;AI大模型正在深刻改变着软件开发的各个环节&#xff0c;重塑着整个开发流程。本文将探讨AI大模型的定义、应用场景、优势以及挑战&#xff0c;并展望未来的发展趋…

【基础】os模块

前言 1、os是operation system&#xff08;操作系统&#xff09;的缩写&#xff1b;os模块就是python对操作系统操作接口的封装。os模块提供了多数操作系统的功能接口函数。&#xff08;OS模块提供了与操作系统进行交互的函数&#xff09; 2、操作系统属于Python的标准实用程…

算法学习027 c++蛇形三角形填充 二维数组常规应用 中小学算法思维学习 比赛算法题解 信奥算法解析

目录 C蛇形三角形填充 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、运行结果 五、考点分析 六、推荐资料 C蛇形三角形填充 一、题目要求 1、编程实现 输入一个正整数N&#xff0c;输出N行的蛇形数字三角形&#xff08;见输出样例&#xf…

[vulnhub]DC: 1

https://www.vulnhub.com/entry/dc-1,292/ 主机发现端口扫描 使用nmap扫描网段类存活主机 因为靶机是我最后添加的&#xff0c;所以靶机IP是156 nmap -sP 192.168.75.0/24 // Starting Nmap 7.93 ( https://nmap.org ) at 2024-09-28 12:48 CST Nmap scan rep…

PyQt5的安装与简介

目录 一、介绍 二、PyQt5的安装 1、安装PyQt5 2、安装Qt的工具包 三、配置Qt工具 1、配置Designer &#xff08;1)、打开pycharm&#xff0c;找到设置选项 &#xff08;2&#xff09;、找到工具-->外部工具 &#xff08;3&#xff09;、点击号&#xff0c;创建外部工…

「Qt Widget中文示例指南」如何实现窗口嵌入?

Qt 是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写&#xff0c;所有平台无差别运行&#xff0c;更提供了几乎所有开发过程中需要用到的工具。如今&#xff0c;Qt已被运用于超过70个行业、数千家企业&#xff0c;支持数百万设备及应用。 本文中的示例主要演…

clickhouse运维篇(三):生产环境一键生成配置并快速部署ck集群

前提条件&#xff1a;先了解集群搭建流程是什么样&#xff0c;需要改哪些配置&#xff0c;有哪些环境&#xff0c;这个文章目的是简化部署。 clickhouse运维篇&#xff08;一&#xff09;&#xff1a;docker-compose 快速部署clickhouse集群 clickhouse运维篇&#xff08;二&am…

【OpenGL】vs中glsl高亮显示插件

vs中glsl高亮显示插件 扩展搜索glsl安装

<项目代码>YOLOv8 猫狗识别<目标检测>

YOLOv8是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一个回归问题&#xff0c;能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法&#xff08;如Faster R-CNN&#xff09;&#xff0c;YOLOv8具有更高的…

jmeter脚本-请求体设置变量and请求体太长的处理

目录 1、查询接口 1.1 准备组织列表的TXT文件&#xff0c;如下&#xff1a; 1.2 添加 CSV数据文件设置 &#xff0c;如下&#xff1a; 1.3 接口请求体设置变量&#xff0c;如下&#xff1a; 2、创建接口 2.1 见1.1 2.2 见1.2 2.3 准备创建接口的请求体TXT文件&#xff…

哔哩哔哩车机版2.7.0|专为司机打造的车机版B站,内容丰富,功能齐全

哔哩哔哩车机版是一款专为司机朋友们打造的车机版应用&#xff0c;扫码登录即可使用。该软件让你通过耳朵了解最新的游戏、动画动漫信息&#xff0c;感受其独特的趣味性内容。车机版亮点包括二次元和三次元的鬼畜视频、原创和翻唱音乐、前沿科技科普、国内外优秀舞蹈作品等。软…

在Mac下安装时间序列软件Hector

1.软件介绍 Hector 是一款开源软件&#xff0c;专用于 GNSS 时间序列数据的处理与分析&#xff0c;广泛应用于地球科学研究。它帮助研究人员从 GNSS 数据中提取长期趋势、周期性成分&#xff0c;并建模噪声特性&#xff0c;用于地壳形变、地震影响和气候变化等方面的研究。Hec…

opencv python笔记

OpenCV课程 OpenCV其实就是一堆C和C语言的源代码文件,这些源代码文件中实现了许多常用的计算机视觉算法。 OpenCV的全称是Open Source Computer Vision Library,是一个开放源代码的计算机视觉库OpenCV最初由英特尔公司发起并开发,以BSD许可证授权发行,可以在商业和研究领域中…

Rust 力扣 - 2461. 长度为 K 子数组中的最大和

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 我们遍历长度为k的窗口&#xff0c;用一个哈希表记录窗口内的所有元素&#xff08;用来对窗口内元素去重&#xff09;&#xff0c;我们取哈希表中元素数量等于k的窗口总和的最大值 题解代码 use std::collecti…