Spring:

image-20211025033843966

依赖:类a中使用类b中的属性或者方法,叫作类a依赖类b

官网:

https://spring.io/

image-20211025034401443

IOC控制反转:

控制反转的概念:

image-20211025040109068

容器:是一个服务器软件,一个框架(spring)

为什么要使用IOC:减少对代码的改动,也能实现不同的功能。实现解耦合

IOC的体现:
image-20211025040917622

IOC的技术实现:

image-20211025041349031

使用Spring容器创建对象:

导入依赖:

统一版本:

<spring.version>5.2.12.RELEASE </spring.version>

image-20211025081553411

<!--spring依赖-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <!--springAOP的包-->
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjweaver</artifactId>
      <version>1.9.4</version>
    </dependency>
    <!--ssm整合jdbc依赖-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>${spring.version}</version>
    </dependency>

    <!--mybatis整合依赖-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>2.0.5</version>
    </dependency>

1、创建配置文件

image-20211025043347412

<?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">

    <!--告诉Spring创建对象
    声明bean,就是告诉Spring要创建某个对象
    id:对象的自定义名称,唯一值,Spring通过这个名称来找到对象
    class:类的全限定名称(不能是接口,因为Spring是反射机制创建对象,必须使用类)

    Spring就完成:
    Foreuser foreuser = new Foreuser();

    spring把创建好的对象放入到map中,Spring框架有一个map存放对象。
    springMap.put(id,对象);
    如:springMap.put("foreuser",new Foreuser());

    一个bean标签声明一个对象

    -->
    <bean id="foreuser" class="com.cykj.entity.Foreuser"></bean>
</beans>
<!--
    spring的配置文件
    1、beans:是根标签
    2、spring-beans.xsd:约束文件,和mybatis一样,
        规定了在这个xml中能使用哪些标签和属性
-->

2、测试方法:

/**
     * 使用Spring容器创建对象
     *默认调用的是无参构造方法
     */
    @Test
    public void springTest(){
        //1、指定Spring配置文件的路径
        String config = "applicationContext.xml";
        //2、创建Spring容器对象,ApplicationContext
        ApplicationContext ac = new ClassPathXmlApplicationContext(config);
        //3、从容器中获取对象
        Foreuser foreuser = (Foreuser) ac.getBean("foreuser");
        System.out.println(foreuser);
    }

Spring创建对象的时间:在创建容器时创建配置文件中的所有对象

获取Spring容器中Java对象的信息:

/**
     * 获取Spring容器中Java对象的信息
     */
    @Test
    public void springTest2(){
        String config = "applicationContext.xml";
        ApplicationContext ac = new ClassPathXmlApplicationContext(config);
        //获取容器中定义的对象的数量
        int nums = ac.getBeanDefinitionCount();
        System.out.println("容器中定义的对象的数量:"+nums);
        //容器中每个定义的对象的名称
        String[] names = ac.getBeanDefinitionNames();
        for(String name:names){
            System.out.println(name);
        }

依赖注入:

实现方式:

1、xml方式注入

2、注解方式注入

语法分类:

1、设值注入(set):常用

2、构造注入

简单类型的设值注入:

 <!--声明foreuser对象
    注入:就是赋值的意思
    简单类型的注入:Spring中规定Java的基本数据类型和String类型都是简单类型
        1、简单类型的注入:
            <bean id="xx" class="yy">
                <property name="属性名称" value="属性值">
                一个property只能给一个属性赋值
                <property.....>
            </bean>
    -->
    <bean id="foreuser" class="com.cykj.entity.Foreuser">
        <property name="fuId" value="1"></property><!--调用的是setFuId()方法-->
        <property name="fuName" value="张三"></property>
    </bean>

/**
     * 简单类型的注入
     */
    @Test
    public void springTest3(){
        String config = "applicationContext.xml";
        ApplicationContext ac = new ClassPathXmlApplicationContext(config);
        Foreuser foreuser = (Foreuser) ac.getBean("foreuser");
        System.out.println(foreuser);
    }

引用类型的设值注入

<!--
        2、引用类型的注入:
            <bean id="xx" class="yy">
                <property name="属性名称" ref="bean的id(对象的名称)">
            </bean>
    -->
    <bean id="tblUser" class="com.cykj.entity.Tbluser">
        <property name="userId" value="1"></property>
        <!--引用类型-->
        <property name="tblrole" ref="tblRole"></property>
    </bean>
    <bean id="tblRole" class="com.cykj.entity.Tblrole">
        <property name="roleId" value="1"></property>
        <property name="roleName" value="管理员"></property>
    </bean>


/**
     * 引用类型的注入
     */
    @Test
    public void springTest4(){
        String config = "applicationContext.xml";
        ApplicationContext ac = new ClassPathXmlApplicationContext(config);
        Tbluser tbluser = (Tbluser) ac.getBean("tblUser");
        System.out.println(tbluser);
    }

构造器注入:

image-20211025062512827

image-20211025062226213

image-20211025062341941

引用类型的自动注入:

byName,byType

image-20211025063428869

image-20211025063833497

注解:

image-20211025064805756

<!--统一管理bean
声明组件扫描器,组件就是Java对象
base-package:要扫描的包
component-scan工作方式:Spring会扫描遍历base-package指定的包
    把包中的所有类,找到类中的注解,按照注解的功能来创建对象,或给属性赋值
-->
<context:component-scan base-package="com.cykj"/>

@Component

@Service

@Respository

简单类型的属性赋值:@value

引用类型的属性赋值:@AutoWrite(bytype)

整合mybatis

1、使用IDEA创建maven工程

image-20211025171256598

2、在pom中引入所有的依赖

3、在main文件夹下创建文件夹java以及resources,并通过项目结构功能将java及resources分别标记为对应功能

4、在resources文件夹中创建mapper文件夹,用来存放mybatis中所有mapper的xml文件

5、在resources创建mybatis配置文件:mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
    <!--打印sql到控制台-->
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING" />
    </settings>
    <!--设置实体类别名-->
    <typeAliases>
        <package name="com.cykj.bean"/>
    </typeAliases>
    <mappers>
        <mapper resource="mapper/UserMapper.xml"></mapper>
    </mappers>
</configuration>

六、在resources创建spring的配置文件,并整合mybatis框架: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"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation=" http://www.springframework.org/schema/context
         https://www.springframework.org/schema/context/spring-context.xsd
         http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--导入属性配置文件-->
<!--    <context:property-placeholder location="classpath:jdbc.properties"/>-->
    <!--
        DataSource:使用Spring的数据源替换Mybatis的配置c3pθ dbcp druid
     我们这里使用Spring提供的JDBC:org.springframework.jdbc.datasource
    -->
    <bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/train12306-2?useSSL=true&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=UTC
"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
    </bean>
    <!--sql会话工厂对象-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="datasource"/>
        <!--连通mybatis、-->
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
    </bean>
    <!-- 将mybatis实现的接口注入到spring容器中 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
        <property name="basePackage" value="com.cykj.mapper"></property>
    </bean>


    <!--统一管理bean-->
    <context:component-scan base-package="com.cykj"/>
</beans>

七、修改web.xml文件,配置spring核心文件

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>

  <context-param>
    <!-- 通过该标签配置的键值对最终是会放到ServletContext(application)中 -->
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
  </context-param>
  <!-- 配置启动IOC容器的监听器:当ServletContext对象创建的时候启动IOC容器 -->
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
</web-app>

八、在java文件夹中分别创建servlet\service\mapper\bean文件夹

九、编写测试的所有代码,测试spring与mybatis是否可用

十、Servlet中本来不能使用@Autowired注入bean,解决办法修改每个servlet中的init方法

package com.cykj.web;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.SpringBeanAutowiringSupport;
import org.springframework.web.context.support.WebApplicationContextUtils;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;

public class BaseServlet extends HttpServlet {
    private ApplicationContext app;

    @Override
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
        //Servlet中本来不能使用@Autowired注入bean,解决办法是在Servlet的init(ServletConfig)方法中调用
        SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this, config.getServletContext());
        app = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
    }
    public Object getObject(Class c) {
        return app.getBean(c);
    }
}

nfig config) throws ServletException {
super.init(config);
//Servlet中本来不能使用@Autowired注入bean,解决办法是在Servlet的init(ServletConfig)方法中调用
SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this, config.getServletContext());
app = WebApplicationContextUtils.getWebApplicationContext(getServletContext());
}
public Object getObject(Class c) {
return app.getBean©;
}
}







版权声明:本文为qq_37917691原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_37917691/article/details/126413303