Spring框架学习笔记 --- [在spring中初步上手使用注解开发;以及JDBC的初步使用]

Posted 小智RE0

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring框架学习笔记 --- [在spring中初步上手使用注解开发;以及JDBC的初步使用]相关的知识,希望对你有一定的参考价值。

spring官网 -->spring官网
spring5.3.12–>spring-framework
在线文档 --> Spring 5.3.12

1.初步上手注解开发

(1)首先试试 xml 进行配置的方式

比如说,我现在要写一个用户管理相关的业务,这时就得配置一下,dao数据访问交互层;service服务层…
那么,在服务层调用数据访问交互层时,就得把dao作为属性放入服务层其中;且提供相应的get,set方法;

先不用注解;简易操作一下开发过程;

首先,在创建的dao包下创建UserDao;模拟数据访问层;里面定义一个方法;(仅模拟使用,并不是真实的业务)

public class UserDao {

    //定义的方法;
    public void saveUser(){
        System.out.println("在数据访问层写的保存用户信息方法~~~~");
    }
}

在创建的service包下创建UserService;模拟服务层;在这里将会调用数据访问层的方法;

public class UserService {
    
    //将数据交互的访问层关联进来作为属性;
    private UserDao userDao;

    //需要写入get,set方法;
    public UserDao getUserDao() {
        return userDao;
    }

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
    
    //保存用户信息的方法;
    public void saveUser(){
        System.out.println("在服务层调用数据访问层写好的方法~~~");
        userDao.saveUser();
    }
    
}

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" xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
    
    <!--模拟业务开发的简易配置-->
    
    <!--数据访问层-->
    <bean id="userDao" class="com.xiaozhi.spring.dao.UserDao">
    </bean>
    
    <!--服务层;需要将 属性userDao(用户数据访问层)配置注入 使用ref引用上面的bean即可-->
    <bean id="userService" class="com.xiaozhi.spring.service.UserService">
        <property name="userDao" ref="userDao"/>
    </bean>
</beans>    

测试调用

package com.xiaozhi.spring.test;

import com.xiaozhi.spring.service.UserService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @author by CSDN@小智RE0
 * @date 2021-11-10 14:09
 */
public class AnalogBusiness {
    @Test
    public void test01(){
        //读取配置文件;
        ApplicationContext ac = new ClassPathXmlApplicationContext("spring.xml");
        //创建用户服务层的对象;
        UserService userService = ac.getBean("userService", UserService.class);

        //测试调用方法;
        userService.saveUser();
    }
}

测试结果;

在服务层调用数据访问层写好的方法~~~
在数据访问层写的保存用户信息方法~~~~

这样在xml文件中进行配置的过程;还是比较容易的;
但使用注解的话,还会简化这个过程;

(2)快速上手注解开发过程

在这个多级的项目中,想要快速把之前的这个之前创建的项目spring01的数据和结构完整复制下来;
具体步骤
—> 先把项目spring01直接Ctrl+ C 复制一下,粘贴到空项目springstudy007目录下;
注意到这个复制过来的项目不是maven项目(没有maven项目标识,且里面的文件不能正常使用),


—>删掉spring01.iml文件

那么就要手动将它变为maven项目

—>点击File,找到项目结构


—>找到Module模块;选择空项目springstudy007;点击加号;但是这里选择导入模块(Import Module)

—>选择到之前复制创建的项目spring02

—>选择maven即可;

—>更改一下名称;点击右下角APPLY–>OK

得到的spring02项目就完全和上面的spring01一样了;

首先是保障项目中有aop的jar工具包;
实际上,在上篇笔记的一开始配置的spring-contextjar包就包含了aop的工具包;

使用注解的话,之前的几个类就稍微改变一下;

数据访问层UserDao使用注解@Repository进行标记

//标注数据访问层
@Repository
public class UserDao {

    //定义的方法;
    public void saveUser(){
        System.out.println("在数据访问层写的保存用户信息方法~~~~");
    }
}

服务层UserService@Service进行标记;
在关联数据访问层的UserDao作为属性时,使用@Autowired标记为自动装配;这时无需编写该属性的get,set方法;

//标记服务层
@Service
public class UserService {

    //将数据交互的访问层关联进来作为属性;
    //标记为自动装配;
    @Autowired
    private UserDao userDao;
    
    //保存用户信息的方法;
    public void saveUser(){
        System.out.println("在服务层调用数据访问层写好的方法~~~");
        userDao.saveUser();
    }
}

将之前的spring.xml里面的配置暂时注释掉;
resources目录下创建spring-useannotations.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">
    <!--标记开启注解扫描-->
    <context:component-scan base-package="com.xiaozhi.spring">
    </context:component-scan>

</beans>

进行测试;

public class AnalogBusiness {
    @Test
    public void test01(){
        //读取配置文件;
        ApplicationContext ac = new ClassPathXmlApplicationContext("spring-useannotations.xml");
        //创建用户服务层的对象; 这里直接按类的反射进行创建即可;
        UserService userService = ac.getBean(UserService.class);

        //测试调用方法;
        userService.saveUser();
    }
}

可调用

在服务层调用数据访问层写好的方法~~~
在数据访问层写的保存用户信息方法~~~~

2.其他的注解使用

@Repository,标记将数据访问层注入spring容器;
@Service ; 标记将服务层注入spring容器;
@Autowired 标注属性自动装配依赖注入

除了刚才简易使用的注解外,目前还需要了解使用的其他注解–>

(1)@Component(value = “user”);

一般在实体类上使用;将该类标注为容器的一个组件;value就是它的值;可看做id;
也就相当于之前在xml文件中进行的配置;==>

 <bean id="user"  class="com.xiaozhi.spring.pojo.User"></bean>

(2)@Scope(value = “prototype”)

对类标注作用域的类型;value不写的话默认为单例singleton

测试使用一下;为User类进行配置;
用注解的方式将User类注入到spring容器中;作用域为原型模式;用@Value对属性进行赋值;
这里暂时去掉了get与set方法;

//将用户类注入到spring容器中;且令其作用域为原型模式;
@Component(value = "user")
@Scope(value = "prototype")
public class User {
    //用户ID,姓名,密码;地址,备注信息;
    @Value("007")
    private Integer id;
    @Value("小智")
    private String account;
    @Value("123654")
    private String password;
    @Value("陕西汉中")
    private String add_ress;
    @Value("备注:")
    private String info;

    //初始化;
    public User() {
        System.out.println("无参构造方法调用了");
    }

    public User(String account, String password, String add_ress, String info) {
        System.out.println("有参构造方法调用了");
        this.account = account;
        this.password = password;
        this.add_ress = add_ress;
        this.info = info;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", account='" + account + '\\'' +
                ", password='" + password + '\\'' +
                ", add_ress='" + add_ress + '\\'' +
                ", info='" + info + '\\'' +
                '}';
    }
}

测试执行调用

//测试注解注入 ;
@Test
public void test08(){
    //读取配置文件;
    ApplicationContext ac = new ClassPathXmlApplicationContext("spring-useannotations.xml");
    //这里创建对象;
    User user  = ac.getBean("user",User.class);
    User user2  = ac.getBean("user",User.class);
    System.out.println(user.hashCode());
    System.out.println(user2.hashCode());
    System.out.println(user);
    System.out.println(user2);
}

测试结果

无参构造方法调用了
无参构造方法调用了
1914301543
1157726741
User{id=7, account='小智', password='123654', add_ress='陕西汉中', info='备注:'}
User{id=7, account='小智', password='123654', add_ress='陕西汉中', info='备注:'}

3.使用注解注入属性的两种方式

(1) 使用@Autowired进行自动注入;

这个注解可以写在属性或者属性的set方法上进行标注;
写在属性字段上的话,就不需要写属性的set方法了;

  • @Autowired()中还可使用required 属性标注这个标注的属性是否可以为null ;
    默认为 required = true(不允许为null)

  • 该注解默认使用按类型自动装配 Bean ;即byType;

  • 该注解也可配合注解@Qualifier(value = "userDao")进行使用;达到按属性名装配;即byName;
    这里的注解@Qualifier(value=" ")中的value就对应注入属性的bean中的id;

(2) 使用JDK 提供的@Resource进行自动注入

此注解也是默认按类型(byType)注入;
也可以设置为按属性名称进行注入(byName);
按属性名称注入时需要设置;name属性
比如:@Resource(name = "userDao")
同样地,这里的name所配置的值,就对应这个属性的对应bean的Id

实际上,这些注解在标注类时;你默认不为他们进行赋值的话,实际生成的Id是默认按类名的首字母小写开始,驼峰式命名;

比如;这里使用这个服务层时就仅使用了@Service进行标注;但是在测试时,我按这个类的首字母小写进行的驼峰式命名,也能进行创建这个类的对象;

使用xml进行配置注入和使用注解进行注入的区别

首先;从xml配置的角度来看,xml的配置是和主代码分离的,在项目中修改了xml中的配置后,不需要重新编译项目,重启服务器即可;但是,使用xml进行配置的话,若项目的业务配置过多,这也会影响到效率问题;

使用注解的话,比较直观,效率也比较高,但是注解和主代码是在一块的;它是以硬编码的方式进行配置;那么在修改了某个注解的使用时,就得重新编译项目

4.在spring中初步快速上手使用JDBC

本次先使用spring提供jdbcTemplate;

先在pom.xml文件下配置需要使用到的jar工具包

<!-- spring-jdbc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.2.2.RELEASE</version>
</dependency>
<!-- 阿里数据源 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.10</version>
</dependency>
<!--mysql-context-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.22</version>
</dependency>

resources目录下编写database.properties属性文件;数据库连接池需要配置的几个简易属性

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/day20211024_study_mybatis_db?characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
user=root
pwd=123456
initialSize = 5
maxActive = 10

resources目录下创建配置spring-jdbc.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">
    <!--标记开启注解扫描-->
    <context:component-scan base-package="com.xiaozhi.spring">
    </context:component-scan>

    <!--配置引入数据源 database.properties-->
    <context:property-placeholder location="database.properties"/>

    <!--创建连接池配置-->
    <bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${user}"/>
        <property name="password" value="${pwd}"/>
        <property name="initialSize" value="${initialSize}"/>
        <property name="maxActive" value="${maxActive}"/>
    </bean>

    <!--配置JdbcTemplate 引用数据源-->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="druidDataSource"/>
    </bean>

</beans>

用户实体类

这里的话,为了方便使用,直接用注解将User类注入spring容器,以及用注解为用户类的属性初始化赋值;
ID,在数据库是设置了主键自增的,这里就不初始化传值了;

//将用户类注入到spring容器中;且令其作用域为原型模式;
@Component(value = "user")
@Scope(value = "prototype")
public class User {
    //用户ID,姓名,密码;地址,备注信息;
    private Integer id;
    @Value("小智RE0")
    private String account;
    @Value("123654")
    private String password;
    @Value("陕西汉中")
    private String add_ress;
    @Value("备注:")
    private String info;


    //初始化;
    public User() {
        System.out.println("无参构造方法调用了");
    }

    public User(String account, String password, String add_ress, String info) {
        System.out.println("有参构造方法调用了");
        this.account = account;
        this.password = password;
        this.add_ress = add_ress;
        this.info = info;
    }

    //getset方法;
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getAccount() {
        return account;
    }

    public void setAccount(String account) {
        this.account = account;
    }

    public String getPassword() {
        return password动力节点Spring框架学习笔记-王鹤spring整合MyBatis

Spring学习笔记--Spring简介

Java学习笔记:Spring框架

动力节点Spring框架学习笔记-王鹤Spring 事务

Spring框架学习笔记 --- [Spring框架整合Mybatis框架]

Spring框架学习笔记 ---[spring框架概念 , 初步上手使用Spring , 控制反转 & 依赖注入初步理解 ]