Java框架--spring(二、IOC,springBean管理,springJDBC)

Java框架--spring(二、IOC,springBean管理,springJDBC),第1张

Java框架--spring(二、IOC,springBean管理,springJDBC) Java框架–spring(二、IOC,springBean管理,springJDBC)

目录
  • Java框架--spring(二、IOC,springBean管理,springJDBC)
    • 一、IOC控制(权)反转
    • 二、spring Bean管理
      • 基于xml配置方式
        • xml配置方式依赖注入(DI)
      • 基于注解方式
        • 注解方式创建对象
        • 注解方式注入属性
      • 注解方式与XML方式对比
    • 三、spring JDBC
      • spring Jdbc开发步骤
        • 1.下载 Spring JdbcTemplate 的 jar 包,mysql的jar包,阿里druid的jar包
        • 2.导入属性文件(存放jdbc连接的信息)
        • 3.管理数据源对象
        • 4.在配置文件中创建JdbcTemplate
        • 5.测试JdbcTemplate

一、IOC控制(权)反转

​ IOC(Inverse of Control),反转控制,是一种设计思想,原来需要在程序中手动地创建对象(在哪需要在哪new),现在我们把创建对象的控制权给spring框架管理

  • 正控:需要对象时,自己手动创建
  • 反控:需要对象时,从spring容器中获取需要的对象

​ IOC 容器是具有依赖注入功能的容器,负责对象的实例化、对象的初始化,对象和对象之间依赖关系配置、对象的销毁、对外提供对象的查找等 *** 作,对象的整个生命周期都是由容器来控制。我们需要使用的对象都由 ioc 容器进行管理,不需要我们再去手动通过 new 的方式去创建对象,由 ioc 容器直接帮我们组装好,当我们需要使用的时候直接从 ioc 容器中直接获取就可以了。

反转控制权的目的:降低耦合度

底层实现:解析xml / 扫描注解标签 + 工厂模式 + 反射机制

二、spring Bean管理 基于xml配置方式

bean 配置需要 spring 管理的类

 
  • id:生成的对象标识

  • class:类的地址(全类名)

  • name:对象别名(可以有多个)

  • scope:作用域/范围 scope默认是singleton

    • singleton:单例模式,整个应用程序只创建一次,多次获取同一个对象(在spring容器(ClassPathXmlApplicationContext)启动时就创建)
    • prototype:原型(多例),每次获取时会创建一个新对象
  • request:每次 Http 请求都会创建一个 Bean, 仅用于 WebApplicationContext环境

  • session:同一个 HttpSession 共享一个 Bean, 不同 Session 使用不同的 Bean, 用于 WebApplicationContext环境

xml配置方式依赖注入(DI)
  • DI:Dependency Injection 依赖注入,在spring创建对象时,将对象的属性(基本类型,引用类型,集合)通过配置**设置给该对象.**实现IOC(控制反转)需要DI(依赖注入)支持

注入方式:

  • setter方法注入

    
    
    
  • 构造方法注入

    • 通过类型注入byType

      
      
    • 通过属性名注入byName

      
      

示例:setter注入

给User类加一个集合属性

private List list;

public void setList(List list) {
	this.list = list;
}

spring配置文件中注入属性值


    
    
    
        
            1
            2
            3
        
    

测试

package test;

import com.ffyc.spring.model.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test1 {
    public static void main(String[] args) {
        ApplicationContext app = new ClassPathXmlApplicationContext("springConfig.xml");
        User user =  (User) app.getBean("user",User.class);
        System.out.println(user);
    }
}

可以看到set方法被调用了,通过set注入,会自动调用实体类的setter方法为属性注入值

基于注解方式

使用注解方式的条件:

  1. 使用注解功能需要依赖一个spring aop jar包,注解功能封装在AOP包中

在导入spring核心包springframework时,自动依赖了aop的jar包

  1. 开启注解扫描


       
   
        
       
   
   
注解方式创建对象
  • 注解方式创建对象(写在类上方)

    • @Component(value = “user”) 在model里使用,不写vlaue时,默认当前类名

      相当于配置文件中的

      @Component(value = "user") 
      public class User {}
      
      
      
    • @Service(value = “userService”)在业务逻辑层中使用(service层)

      //创建对象
      @Service(value = "userService")
      public class UserService {}
      
    • @Repository(value = “userDao”)在数据访问层(持久层)使用(dao层)

      @Repository(value = "userDao")//创建对象
      public class UserDao {}
      
  • 注解方式指定生成对象单例/多例

    • @Scope(value = “singleton”)指定生成对象的策略(singleton-单例 prototype-原型(多例))

      @Component(value = "user") 
      @Scope(value = "singleton")
      public class User {}
      
注解方式注入属性

注解方式注入属性(写在属性上方)

  • @Autowired 自动注入

    • 属性required:设置属性取值是否允许null值 required=true/false 默认true

    • 可以写在属性上或setter方法上,写在属性上可以不写setter方法

    • 注入方式:

      • byType,按属性类型注入,默认使用byType方式

        	@Autowire
            private UserDao userDao;
            //spring提供的注入方式,Autowired(required = true)默认true 注入的值不能为Null
        
      • byName,按属性名称注入,若想按名称注入,可以结合**@Qualifier**注解一起使用

  • @Qualifier 自动注入

    • value=被注解属性的id值(属性为User id=user)

    • 	@Autowired//写在属性上可以不写setter方法
          @Qualifier(value = "userDao")
          private UserDao userDao;
      
  • JDK 注解@Resource 自动注入

    • Spring 提供了对 jdk 中**@Resource** 注解的支持。

      • @Resource 注解既可以按名称匹配 Bean,也可以按类型匹配 Bean。默认按照 ByName 自动注入
      • 属性name=被注解属性的id值(属性为User id=user)
    • @Resource(name="userDao")
      private UserDao  userDao;
      
注解方式与XML方式对比 优点缺点注解方式方便,直观,高效(代码少,没有配置文件的书写那么复杂)以硬编码的方式写入到 Java 代码中,修改是需要重新编译代码的xml配置方式配置和代码是分离的,在 xml 中做修改,无需编译代码,只需重启服务器即可将新的配置加载编写麻烦,效率低,大型项目过于复杂 三、spring JDBC

Spring 是个一站式框架:

Spring 自身也提供了控制层的 SpringMVC 和 持久层的 Spring JdbcTemplate

spring Jdbc开发步骤 1.下载 Spring JdbcTemplate 的 jar 包,mysql的jar包,阿里druid的jar包
		
        
            org.springframework
            spring-jdbc
            5.2.2.RELEASE
        

        
        
            mysql
            mysql-connector-java
            8.0.25
        
        
        
        
            com.alibaba
            druid
            1.1.10
        
2.导入属性文件(存放jdbc连接的信息)

config.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
# 用户密码(用于连接数据库)
pwd=root
#连接池初始化时初始化的数据库连接数
initialSize=10
#连接池中最多可空闲maxIdle个连接
minIdle=5
#连接池支持的最大连接数
maxActive=20

创建一个存储jdbc连接的配置文件db.xml,导入jdbc属性文件





        

    
    

3.管理数据源对象

在db.xml中管理与数据库连接(数据源)的配置

	
    
        
        
        
        
        
        
        
        
    
4.在配置文件中创建JdbcTemplate
	
    
        
    

配置完JdbcTemplate类后,我们在Java中获取JdbcTemplate的对象,就可以直接使用

JdbcTemplate 中常用的方法

  • execute() 无返回值,可执行 DDL(create drop alter),增删改语句
  • update() 执行新增、修改、删除语句,返回值为影响的行数
  • queryForObject()返回单个对象
  • query() 执行查询语句,返回一个List
5.测试JdbcTemplate

UserService类

package com.ffyc.spring.service;

import com.ffyc.spring.dao.UserDao;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;

//创建对象
@Service(value = "userService")
public class UserService {
    
    @Resource(name="userDao")
    private UserDao  userDao;

    public void test(){
        userDao.test();
    }
}

UserDao类

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 java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;


@Repository(value = "userDao")//创建对象
public class UserDao {

    @Autowired(required = true)
    JdbcTemplate jdbcTemplate;

    public void test(){
        //execute执行DDL语句(create drop alter)
        //jdbcTemplate.execute("create table test(id int,name varchar(10))");

 		//update 修改,删除,新增
 		//jdbcTemplate.update("insert into admin(account,pass_word,sex)values(?,?,?)","admin888","666666","男");

        
       

        //查询绑定变量
       

        //查找单个对象
        



        //查找多个对象
        List list = jdbcTemplate.query("select * from admin",
                new RowMapper() {
                    @Override
                    public Admin mapRow(ResultSet resultSet, int i) throws SQLException {
                        Admin admin1 = new Admin();
                        admin1.setId(resultSet.getInt("id"));
                        admin1.setAccount(resultSet.getString("account"));
                        admin1.setPassWord(resultSet.getString("pass_word"));
                        admin1.setSex(resultSet.getString("sex"));
                        return admin1;
                    }
                });
        System.out.println(list);
    }
}

查找指定的一个对象

查找多个对象的集合

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5437528.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-11
下一篇 2022-12-11

发表评论

登录后才能评论

评论列表(0条)

保存