Spring

Spring核心: Ioc (控制反转):降低程序间的耦合(依赖关系)

spring配置:https://blog.csdn.net/qq_47959003/article/details/

Spring开发步骤:

  • 导入Spring开发的基本包坐标
    –Bean标签配置
    ID:Bean实例在Spring容器中的唯一性标识
    class:Bean的全限定名称
    scope:singleton:默认属性,此时只有一个配置属性,只加载一个配置文件 prototype:此时会加载多个配置文件,地址不一样,运行实例会运行多次无参构造

  • 创建Dao接口和实现类
  • 创建Spring核心配置文件
  • 在Spring配置文件中配置UserDaoImpl
  • 使用Spring的API获得Bean实例

Spring重点配置:
在这里插入图片描述
在这里插入图片描述

<bean>
	id属性:在容器中Bean实例的唯一标识,不允许重复
	class属性:要实例化的Bean的全限定名
	scope属性:Bean的作用范围,常用是Singleton(默认)和prototype
	<property>标签:属性注入
		name属性:属性名称
		value属性:注入的普通属性值
		ref属性:注入的对象引用值
		<List>标签
		<map>标签
		<properties>标签
	<constructor-arg>标签:属性内容同理bean
<import>标签:导入其他Spring分文件
Spring配置properties文件

<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"  //表示引入context加载
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                            http://www.springframework.org/schema/context  http://www.springframework.org/schema/context/spring-context.xsd">  //导入context加载路径,复制beans,把beans改为context
    <!-- 加载外部properties内容  -->
    <context:property-placeholder location="classpath:jdbc.properties"/>

    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> //class 表示引入的解析文件对象
        <property name=" " value="${key}"/>  //name自定义,key为文件中的对应对象
    </bean>

简单实现案例:
采用mvc(model,vision,controll)三层架构设计模式
设计Dao接口,Dao实现类接口,实现方法
Service层接口,service实现类接口,方法实现ApplicationContext对象实例化
controller实现Service对象方法,实例化对象实现方法

在这里插入图片描述

dao层:

接口:
public interface UserDao {
        void run();
}

实现方法:
import com.example.spring_ioc_1.Dao.UserDao;

public class UserDaoImpl implements UserDao {
    @Override
    public void run() {
        System.out.println("run.....");
    }
}

Service层:

接口:
public interface UserService {
    public void save();
}

实现方法:
import com.example.spring_ioc_1.Dao.UserDao;
import com.example.spring_ioc_1.Service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class UserServiceImpl implements UserService {
    public void save() {
        ApplicationContext app=new ClassPathXmlApplicationContext("applicationContext.xml");
        UserDao userDao = (UserDao) app.getBean("userDao");
        userDao.run();

    }
}

web控制中心:

import com.example.spring_ioc_1.Service.UserService;
import com.example.spring_ioc_1.Service.impl.UserServiceImpl;


public class Controller {
    public static void main(String[] args) {
        UserService userService = new UserServiceImpl();
        userService.save();
    }
}

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

    <bean id="userDao" class="com.example.spring_ioc_1.Dao.Impl.UserDaoImpl">

    </bean>
    <bean id="userService" class="com.example.spring_ioc_1.Service.impl.UserServiceImpl">

    </bean>
</beans>

Bean依赖注入:
采用注入方法就不用实现方法
在这里插入图片描述
在这里插入图片描述

– 构造方法
在这里插入图片描述

在这里插入图片描述
name属性指向构造方法中的userDao,ref指向id中的userDao

– set方法

在这里插入图片描述
在这里插入图片描述
当注入的属性值较多时,使用p命名空间
在这里插入图片描述

属性注入

– 普通属性注入:
在这里插入图片描述
在这里插入图片描述

– 集合注入:
创建集合
在这里插入图片描述
map对象设置实现类
setter,getter,tostring方法
在这里插入图片描述
bean编写:
在这里插入图片描述
在这里插入图片描述

配置文件的引入:
当业务较多时,为了区分业务模块,可以进行模块的引入

在这里插入图片描述
在这里插入图片描述
Spring相应api:
当容器中的bean相同class属性只有一种时,可以使用
在这里插入图片描述
相同class出现多次时使用id指向唯一性:
在这里插入图片描述

数据源开发:

– c3p0数据源

<dependency>
            <groupId>com.mchange</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.5.2</version>
        </dependency>
   @Test
    //测试c3p0数据源
    public void test1() throws PropertyVetoException, SQLException {
        ComboPooledDataSource source = new ComboPooledDataSource();
        source.setDriverClass("com.mysql.cj.jdbc.Driver");
        source.setJdbcUrl("jdbc:mysql://localhost:3306");
        source.setUser("sa");
        source.setPassword("123456");
        Connection connection = source.getConnection();
        System.out.println(connection);
        connection.close();
    }

– druid数据源

<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.8</version>
        </dependency>
    @Test
    //测试druid数据源
    public void test2() throws SQLException {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306");
        dataSource.setUsername("sa");
        dataSource.setPassword("123456");
        DruidPooledConnection connection = dataSource.getConnection();
        System.out.println(connection);
        connection.close();

    }

– 抽取properties文件进行测试

properties文件:
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306
jdbc.user=sa
jdbc.password=123456
    @Test
    //测试c3p0数据源(抽取properties文件)
    public void test3() throws PropertyVetoException, SQLException {
        //读取配置文件
        ResourceBundle rb = ResourceBundle.getBundle("jdbc"); // 传入文件地址
        String driver = rb.getString("jdbc.driver");
        String url = rb.getString("jdbc.url");
        String user = rb.getString("jdbc.user");
        String password = rb.getString("jdbc.password");
        //创建数据源对象,设置连接
        ComboPooledDataSource dataSource=new ComboPooledDataSource();
        dataSource.setDriverClass(driver);
        dataSource.setJdbcUrl(url);
        dataSource.setUser(user);
        dataSource.setPassword(password);
        Connection connection = dataSource.getConnection();
        System.out.println(connection);
        connection.close();
    }

    @Test
    //测试druid数据源(抽取properties文件)
    public void test4() throws SQLException {
        //读取配置文件
        ResourceBundle rb = ResourceBundle.getBundle("jdbc"); // 传入文件地址
        String driver = rb.getString("jdbc.driver");
        String url = rb.getString("jdbc.url");
        String user = rb.getString("jdbc.user");
        String password = rb.getString("jdbc.password");
        //创建数据源对象,设置连接
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driver);
        dataSource.setUrl(url);
        dataSource.setUsername(user);
        dataSource.setPassword(password);
        DruidPooledConnection connection = dataSource.getConnection();
        System.out.println(connection);
        connection.close();

    }

spring加载数据源对象
根据抽取数据源对象的不同,需要注意class引用的对象

 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="com.mysql.cj.jdbc.Driver"/>
        <property name="jdbcUrl" value="jdbc:mysql://localhost:3306"/>
        <property name="user" value="sa"/>
        <property name="password" value="123456"/>
    </bean>

引入context命名空间

<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 http://www.springframework.org/schema/contesxt/spring-context.xsd">
    <!--        上边引入的对象为context创造命名空间-->

spring加载外部properties文件,并且配置对象
模板:

    <context:property-placeholder location="xxx.properties"/>
             <property name=" " value="${ }"/>

实现:

   <!--    加载外部properties文件-->
    <context:property-placeholder location="classpath:jdbc.properties"/>

    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="${jdbc.driver}"/>
        <property name="jdbcUrl" value="${jdbc.url}"/>
        <property name="user" value="${jdbc.user}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>
    
    //测试spring容器产生数据源对象
    public void test5() throws SQLException {
        ApplicationContext app=new ClassPathXmlApplicationContext("applicationContext.xml");
        ComboPooledDataSource dataSource = (ComboPooledDataSource) app.getBean("dataSource");
        Connection connection = dataSource.getConnection();
        System.out.println(connection);
        connection.close();
    }

注解开发:

在这里插入图片描述
在这里插入图片描述

案例实现:

配置Dao层
Service层
web层
以及applicationContext.xml文件
在这里插入图片描述
applicationContext.xml文件配置组件库的扫描,以便对注解开发的命令进行实例化

  <!--    配置组件扫描-->
    <context:component-scan base-package="spring_ioc_1"/>

Dao层

userDaoImpl文件:(语句替换)
//<bean id="userDao" class="com.example.spring_ioc_1.Dao.Impl.UserDaoImpl"/>
("userDao")

userServiceIml文件:
在这里插入图片描述
在这里插入图片描述
@value标签
1:直接赋值普通属性
2:进行properties文件的抽取(spring需要配置命名空间)
在这里插入图片描述
在这里插入图片描述
注解标注:
4种注解含义一样,对于实现的层级不一样
在这里插入图片描述
初始方法,销毁方法
销毁方法需要在web层手动结束,初始方法在程序执行开始执行
在这里插入图片描述
实现在Dao层
在这里插入图片描述
web层关闭
在这里插入图片描述
Spring新注解:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

配置spring核心类,还可以根据应用的不同建立不同的分文件
在这里插入图片描述
spring核心类,该类调用

//标志该类是Spring核心配置类


//<!--    配置组件扫描-->
//<context:component-scan base-package="spring_ioc_1"/>
("spring_ioc_1")

//导入数据类对象到核心配置文件中来,当需要导入多个时用{}
({DataSourceConfiguration.class})
public class SpringConfiguration {
}

数据类:

//<!--    加载外部properties文件-->
//<context:property-placeholder location="classpath:jdbc.properties"/>
("classpath:jdbc.properties")
public class DataSourceConfiguration {
        ("${jdbc.driver}")
    private String driver;
    ("${jdbc.url}")
    private String url;
    ("${jdbc.user}")
    private String user;
    ("${jdbc.password}")
    private String password;

    ("dataSource")
    public ComboPooledDataSource getDataSource() throws PropertyVetoException { 
     //Spring会将当前的返回值以指定名称存储到Spring容器中
        ComboPooledDataSource source = new ComboPooledDataSource();
        source.setDriverClass(driver);
        source.setJdbcUrl(url);
        source.setUser(user);
        source.setPassword(password);
        return source;
    }
}

基于Spring的Test框架:

导入配置:
 		<dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.0.2.RELEASE</version>
        </dependency>
定义框架
//基于spring框架的测试
(SpringJUnit4ClassRunner.class)

//该方法为xml文档测试,声明Spring容器的架构指定
//@ContextConfiguration("classpath:applicationContext.xml")
(classes={SpringConfiguration.class})

进行测试编写
    //进行字段注入
    
    private UserService userService;

    
    private DataSource dataSource;

    
    public void test1() throws SQLException {
        userService.save();
        System.out.println(dataSource.getConnection());
    }

Spring集成web环境——基本三层架构

业务层——>对象层——>Dao层
配置tomcat服务器
业务层:


public class userServlet extends HttpServlet {
    
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ApplicationContext app=new ClassPathXmlApplicationContext("applicationContext.xml");
        UserService userService = (UserService) app.getBean("userService");
        userService.save();
    }
}

web.xml配置

导入相应的坐标实现
 <servlet>
        <servlet-name>UserServlet</servlet-name>
        <servlet-class>com.example.spring_ioc_1.web.userServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>UserServlet</servlet-name>
        <url-pattern>/userServlet</url-pattern>
    </servlet-mapping>

在这里插入图片描述
在这里插入图片描述
实现监听对象,减少引用上下文实例的实现:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
spring架构实现的应用上下文架构:
不知道为啥用不了

   <!-- spring容器生命周期监听器配置 -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <!-- 指定spring配置文件位置 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喵星人来踩博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值