Spring框架(二:依赖注入与注解)

ref和value的区别

    指 Spring 创建对象的过程中,将对象依赖属性(简单值,集合,对象)通 过配置设置给该对象。
    注入的方式:

  1. set 方法注入
  2. 构造方法注入(相对较少)
<!--1.构造方法-->
<!--<bean id="user" class="com.ffyc.spring.model.User">
        <constructor-arg name="name" value="张三"></constructor-arg>
        <constructor-arg name="age" value="20"></constructor-arg>
    </bean>-->
    <bean id="user" class="com.ffyc.spring.model.User">
        <constructor-arg type="java.lang.String" value="李四"></constructor-arg>
        <constructor-arg type="java.lang.Integer" value="21"></constructor-arg>
    </bean>
<!--2.set方法-->
<bean id="user1" class="com.ffyc.spring.model.User">
        <property name="name" value="张三"></property>
        <property name="age" value="21"></property>
    </bean>

    <bean id="userDao" class="com.ffyc.spring.dao.UserDao"></bean>
    <bean id="userService" class="com.ffyc.spring.service.UserService">
        <property name="userDao" ref="userDao"></property>
    </bean>
    <!--value注入的是具体的值(张三、21),ref注入的是userDao的bean-->

注解方式实现

pom:需要配置一些jar包和依赖jar包**。注解功能封装在 AOP 包中,导入 Spring aop jar 包即可**

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

是spring本身依赖的jar包AOP功能已经封装在里面

开启注解扫描

<!--这个报名是最大的包名,也是项目名,意味着此项目的所有包都开启了注解扫描-->
<context:component-scan base-package="包名"> </context:component-scan>

注解创建对象

开启注解扫描后,就不用再spring.xml的bean里面在进行注入,直接用注解标签的方法依赖注入
• 注解创建对象

@Component(value=“user”)等于 <bean id=“user” class=“”></bean>
@@Service(value="userService") 
@@Repository(value="userDao") 这都是类型注入,可以不用写value

    以上注解都可以实现创建对象功能,只是为了后续扩展功能,在不同的层 使用不同的注解标记

@Scope(value=“prototype”) 原型
@Scope(value=“ singleton ”) 单例

注解方式注入属性

    @Autowired
@Autowired 是 Spring 提供的注解,可以写在字段和 setter 方法上。如果写在 字段上,那么就不需要再写 setter 方法。默认情况下它要求依赖对象必须存在, 如果允许 null 值,可以设置它的 required 属性为 false。
    byType 自动注入
该注解默认使用按类型自动装配 Bean 的方式
    byName 自动注入
如果我们想使用按照名称(byName)来装配,可以结合@Qualifier 注解一起使用。
需要在引用属性上联合使用注解@Autowired 与@Qualifier。@Qualifier 的 value 属性用于指定要匹配的 Bean 的 id 值。
    JDK 注解@Resource 自动注入
Spring 提供了对 jdk 中@Resource 注解的支持。@Resource 注解既可以按名 称匹配 Bean,也可以按类型匹配 Bean。默认按照 ByName 自动注入
    byName 注入引用类型属性
@Resource 注解指定其 name 属性,则 name 的值即为按照名称进行匹配 的 Bean 的 id。


    /**
     * @Autowired(required = true) 默认 注入值不能为空
     * @Autowired是根据属性的类型自动注入(根据属性的类型在spring容器中查找) byType
     *
     * 也可以通过对象名查找注入,需要结合@Qualifier(value="userDao") byName
     * @Autowired
     *     @Qualifier(value="userDao")
     *     private UserDao userDao;
     *
     * @Resouece(name="userDao")是JDK自身提供的注解标签,也指出byName和byType两种注解方式
     * name="userDao" 指定注入的对象
     */

    /**
     * 注解:
     * 创建对象
     * 1.@Component(value="user")
     * 2.@Scope(value="singleton")
     * 3.@Repository(value="userDao")
     * 4.@Service(value="userService")
     * 5.@Controller
     *
     * 注入对象:
     * @Autowired(required=true) 添加在属性,set方法,构造方法  是spring提供的注解标签 支持byName,byType
     * @Qualifier(value="userDao") byName
     * @Resouece(name="userDao")是JDK自身提供的注解标签
     */

注解与 XML 的对比

注解优点: 方便,直观,高效(代码少,没有配置文件的书写那么复杂)。
**注解缺点:**以硬编码的方式写入到 Java 代码中,修改是需要重新编译代码的。
xml 优点是: 配置和代码是分离的,在 xml 中做修改,无需编译代码,只需重 启服务器即可将新的配置加载。
xml 的缺点是: 编写麻烦,效率低,大型项目过于复杂。

Spring JDBC

Spring 是个一站式框架:Spring 自身也提供了控制层的 SpringMVC 和 持久 层的 Spring JdbcTemplate。
首先导入Spring JdbcTemplate 的 jar 包

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.2.2.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.16</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.10</version>
        </dependency>

在db.xml导入属性文件

<context:property-placeholder location="config.properties"></context:property-placeholder>

在这里插入图片描述
算上mybatis的log4j,一共需要配置6个属性文件,当然也可以写在一个xml属性里面,只不过这样会有点乱

  1. comfig.properties配置的是JDBC连接数据库的别名和里面的内容:
Driver=com.mysql.cj.jdbc.Driver
Url=jdbc:mysql://127.0.0.1:3306/mybatis_db?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
Uname=root
PSD=wang666
initialSize=5
maxActive=10

  1. db.xml里面配置约束、spring的读取文件、与数据库的连接、spring提供JdbcTemplate封装类和配置事务管理器
<?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/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

    <!--spring读入属性文件-->
    <context:property-placeholder location="config.properties"></context:property-placeholder>
    <!--配置与数据库的连接-->
    <bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${Driver}"></property>
        <property name="url" value="${Url}"></property>
        <property name="username" value="${Uname}"></property>
        <property name="password" value="${PSD}"></property>
        <property name="initialSize" value="${initialSize}"></property>
        <property name="maxActive" value="${maxActive}"></property>
    </bean>

    <!--spring提供JdbcTemplate封装类-->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="druidDataSource"></property>
    </bean>

    <!--配置事务管理器-->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="druidDataSource"></property>
    </bean>
</beans>
  1. log4j不必多说,从tomcat里面下载一份即可,内容仅需改动存放日志的地址
  2. mybatis-config.xml配置的是一些mybatis的配置开、关,比如驼峰、懒加载、二级缓存等等
<?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>

    <settings>
        <setting name="logImpl" value="LOG4J"/>
        <!--是否开启驼峰自动映射 -->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
        <!--懒加载-->
        <setting name="lazyLoadTriggerMethods" value="true"/>
        <!--二级缓存,默认为开启状态-->
        <setting name="cacheEnabled" value="true"/>
    </settings>

    <typeAliases>
        <package name="com.ffyc.ssm.model"/>
    </typeAliases>
</configuration>

spring_mybatis.xml需要配置其管理生成的sqlSessionFactory和生成指定包下面的接口代理对象

<?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
        https://www.springframework.org/schema/beans/spring-beans.xsd
        ">

    <!--spring管理生成SqlSessionFactory-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="druidDataSource"></property>
        <property name="configLocation" value="classpath:mybatis-config.xml"></property>
        <property name="mapperLocations" value="classpath:mapper/*Mapper.xml"></property>
    </bean>
    <!--生成指定包下面的借口代理对象-->
    <bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.ffyc.ssm.dao"></property>
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
    </bean>
</beans>

最后一个spring.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/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
       ">

    <!--spring注解扫描-->
    <context:component-scan base-package="com.ffyc.ssm"></context:component-scan>

    <import resource="db.xml"></import>
    
    <import resource="spring_mabatis.xml"></import>
    
</beans>

然后再dao包中导入JdbcTemplate,注入对象

package com.ffyc.spring.dao;

import com.ffyc.spring.model.Admin;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import java.beans.Transient;

@Repository(value = "userDao")
public class UserDao {

    @Autowired
    JdbcTemplate jdbcTemplate;


    public void save() {
        jdbcTemplate.update("insert into admin(account,password,sex) values(?,?,?)","admin1","111","男");
    }
    public  void save1(){
        jdbcTemplate.update("insert into admin(account,password,sex) values(?,?,?)","admin2","222","男");
    }

}

在类中获得 JdbcTemplate 对象,就可以直接使用。
JdbcTemplate 中常用的方法
execute:无返回值,可执行 ddl,增删改语句
update:执行新增、修改、删除语句;
queryForXXX:执行查询相关语句;
service:

import com.ffyc.spring.dao.UserDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;

@Service(value = "userService")
public class UserService {

    @Resource(name="userDao")
    private UserDao userDao;

    @Transactional//添加事务管理
    public void saveUser(){
        userDao.save();
        System.out.println(10/0);
        userDao.save1();
    }
}

最后在test中运行即可

import com.ffyc.spring.service.UserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test1 {
    public static void main(String[] args){

        ApplicationContext app = new ClassPathXmlApplicationContext("spring.xml");

        UserService userService = app.getBean("userService",UserService.class);
        userService.saveUser();
    }
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值