Spring--快速入门,2024年最新阿里内部Java突击宝典

//2.获取连接

Connection conn=DriverManager.getConnection(“jdbc:mysql://localhost:3306/spring?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8&useSSL=false”

,“root”,“520992”);

//3.获取操作数据库的预处理对象

PreparedStatement pstm =conn.prepareStatement(“select * from account”);

//4.执行SQL,得到结果

ResultSet rs=pstm.executeQuery();

//5.遍历结果集

while(rs.next()){

System.out.println(rs.getString(“name”));

}

//6.释放资源

rs.close();

pstm.close();

conn.close();

}

}

使用Class.forName("com.mysql.cj.jdbc.Driver");的运行结果:

在这里插入图片描述

使用DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver()); 的运行结果:

在这里插入图片描述

第一种方法在运行时报了:java.lang.ClassNotFoundException异常,而第二种方法直接在编译期报了程序包不存在的错误。显然第一种方法比第二种方法更具有优势,降低了对程序包的依赖程度。

从上面可以看出,降低程序间的耦合(解耦)的思路是:

  • 第一步,使用反射来创建对象,而避免使用new关键字

  • 第二步:通过读取配置文件来获取要创建的对象全限定类名

Spring中的IOC


IOC(Inversion of Control,控制反转)。这是spring的核心。IOC 并不是一种技术,只是一种思想,一种降低程序间耦合,优化程序的设计思想。在学习Spring之前,我们在编写程序时,我们的类中往往会new出许多依赖对象,从而使程序间的耦合度越来越高。

所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系。

Spring IOC 负责创建对象,管理对象(通过依赖注入(DI)),装配对象,配置对象,并且管理这些对象的整个生命周期。IOC(控制反转)或DI(依赖注入)把应用的代码量降到最低,使应用容易测试,单元测试不再需要单例和JNDI查找机制,最小的代价和最小的侵入性实现了较低的耦合度。IOC容器支持加载服务时的饿汉式初始化和懒加载。

案例:基于xml的IOC搭建入门

项目目录:

在这里插入图片描述

在pom.xml添加spring框架的相关依赖:org.springframework-spring-context-5.0.2.RELEASE

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns=“http://maven.apache.org/POM/4.0.0”

xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”

xsi:schemaLocation=“http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd”>

4.0.0

org.example

spring_day01_spring1

1.0-SNAPSHOT

jar

org.springframework

spring-context

5.0.2.RELEASE

创建业务层接口和实现类:

/**

  • @Author: Ly

  • @Date: 2020-07-21 16:29

  • 账户业务层的接口

*/

public interface IAccountService {

/**

  • 模拟保存账户

*/

void saveAccount();

}

/**

  • @Author: Ly

  • @Date: 2020-07-21 16:31

  • 账户的业务成实现类

*/

public class AccountServiceImpl implements IAccountService {

private IAccountDao accountDao=new AccountDaoImpl();

public AccountServiceImpl(){

System.out.println(“对象创建了”);

}

public void saveAccount() {

accountDao.saveAccount();

}

}

创建持久层接口和实现类:

/**

  • @Author: Ly

  • @Date: 2020-07-21 16:33

  • 账户的持久层接口

*/

public interface IAccountDao {

/**

  • 模拟保护账户

*/

void saveAccount();

}

/**

  • 账户的持久层实现类

*/

public class AccountDaoImpl implements IAccountDao {

public void saveAccount() {

System.out.println(“保存了账户”);

}

}

配置Bean.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">

测试代码:

public class Client {

/*

  • 获取spring的Ioc核心容器,并根据id获取对象

  • ApplicationContext的三个常用实现类

  • ClassPathXmlApplicationContext: 它可以加载类路径下的配置文件,要求配置文件必须在类路径下。不在的话,加载不了
    
  • FileSystemXmlApplicationContext: 他可以加载磁盘任意路径下的配置文件(必须有访问权限)
    
  • AnnotationConfigApplicationContext:它是用于读取注解创建容器的
    
  • 核心容器的两个接口引发出的问题:

  • ApplicationContext: 单例对象适用 一般采用此接口

  • 它在创建核心容器时,创建对象采用的策略是采用立即加载方式,只要一读取完配置文件马上就创建文件中的配置对象。

  • BeanFactory: 多例对象适用

  • 它在创建核心容器时,创建的对象采取的策略是采用延迟加载的方式,什么时候id获取对象了,什么时候才真正的创建对象。

*/

public static void main(String[]args){

//1.获取核心容器对象

ApplicationContext ac=new ClassPathXmlApplicationContext(“bean.xml”);

//ApplicationContext ac=new FileSystemXmlApplicationContext(“F:\Intellij idea\spring\spring_day01_spring1\src\main\resources\bean.xml”);//配置文件对应的磁盘中的绝对路

//2.根据id获取Bean对象

IAccountService as=(IAccountService)ac.getBean(“accountService”);

IAccountDao ad=ac.getBean(“accountDao”,IAccountDao.class);

/*//------BeanFactory获取核心容器对象---------

Resource resource=new ClassPathResource(“bean.xml”);

BeanFactory factory=new XmlBeanFactory(resource);

IAccountService as=(IAccountService)factory.getBean(“accountService”);

IAccountDao ad=factory.getBean(“accountDao”,IAccountDao.class);*/

System.out.println(as);

System.out.println(ad);

}

}

运行结果:

在这里插入图片描述

从结果中可以看出,我们并没有使用new的方式实例化对象,但是我们的对象已经被实例化了。

实例化 Bean对象


Bean是Spring容器初始化、装配和管理的对象,它是由 spring 来创建的,默认情况下它调用的是类中的无参构造函数。如果没有无参构造函数则不能创建成功。

标签的属性:<bean>

id: 给对象在容器中提供一个唯一标识。用于获取对象。

class: 指定类的全限定类名。用于反射创建对象。默认情况下调用无参构造函数。

scope: 指定对象的作用范围。

  • singleton :默认值,单例的.

  • prototype :多例的.

  • request :WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 request 域中.

  • session :WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 session 域中.

  • global session :WEB 项目中,应用在 Portlet 环境.如果没有 Portlet 环境那么globalSession 相当于 session

init-method: 指定类中的初始化方法名称。

destroy-method: 指定类中销毁方法名称。

创建Bean的三种方式

项目结构:

在这里插入图片描述

第一种方式:根据默认无参构造函数来创建类对象。如果 bean 中没有默认无参构造函数,将会创建失败。在spring的配置文件中使用bean标签,配以id和class属性之后,且没有其它属性和标签时,采用的就是默认函数创建bean对象,此时如果类中没有默认构造函数则对象无法创建。

第二种方式:使用普通工厂中的方法创建对象(使用某个类中的方法创建对象,并存入spring容器)

/**

  • @Author: Ly

  • @Date: 2020-07-23 23:27

  • 模拟一个工厂类(该类可能是存在于jar包中的,我们无法通过修改源码的方式来提供默认构造函数)

*/

public class InstanceFactory {

public IAccountService getAccountService(){

return new AccountServiceImpl();

}

}

第三种方法:使用工厂中的静态方法创建对象(使用某个静态方法创建对象,并存入spring容器)

/**

  • @Author: Ly

  • @Date: 2020-07-23 23:27

  • 模拟一个工厂类(该类可能是存在于jar包中的,我们无法通过修改源码的方式来提供默认构造函数)

*/

public class StaticFactory {

public static IAccountService getAccountService(){

return new AccountServiceImpl();

}

}

bean 的作用范围和生命周期:

<?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=“accountService” class=“com.ly.service.impl.AccountServiceImpl”

scope=“prototype” init-method=“init” destroy-method=“destroy”>

依赖注入


依赖注入:Dependency Injection, 它是 spring 框架核心 IOC的具体实现。

我们的程序在编写时,通过控制反转,把对象的创建交给了 spring,但是代码中不可能出现没有依赖的情况。我么知道IOC的作用是降低程序间的耦合,而不是消除耦合。对于我们项目中业务层和持久层的依赖关系,我们可以交给 spring 来维护,在我们的类中需要用到其他类的对象时,可以由由spring为我们提供。通过spring框架把持久层对象传入到业务层,从而省去我们自己获取的步骤。

依赖注入可以注入三种类型的数据:基本类型和string、其他bean类型(在配置文件中或者注解配置过的bean)、复杂类型/集合类型

同时有三种注入方式:构造函数提供、set方式提供、注解提供

案例:

在这里插入图片描述

构造函数注入:

通过使用类中的构造函数,给成员变量赋值。在这之中,赋值的操作不是我们自己做的,而是通过配置的方式,让 spring 框架来为我们注入。具体代码如下:

/**

  • @Author: Ly

  • @Date: 2020-07-21 16:31

  • 账户的业务成实现类

*/

public class AccountServiceImpl implements IAccountService {

//如果是经常变化的数据,并不适用于注入的方式

private String name;

private Integer age;

private Date birthday;

public AccountServiceImpl(String name,Integer age,Date birthday){

this.name=name;

this.age=age;

this.birthday=birthday;

}

public void saveAccount() {

System.out.println(“service中的saveAccount方法执行了,”+name+“,”+age+“,”+birthday);

}

}

set方法注入

在类中提供需要注入成员的 set 方法,进行注入。具体代码如下:

/**

  • @Author: Ly

  • @Date: 2020-07-21 16:31

  • 账户的业务成实现类

*/

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

总结

面试前的“练手”还是很重要的,所以开始面试之前一定要准备好啊,不然也是耽搁面试官和自己的时间。

我自己是刷了不少面试题的,所以在面试过程中才能够做到心中有数,基本上会清楚面试过程中会问到哪些知识点,高频题又有哪些,所以刷题是面试前期准备过程中非常重要的一点。

面试题及解析总结

三年Java开发,刚从美团、京东、阿里面试归来,分享个人面经

大厂面试场景

三年Java开发,刚从美团、京东、阿里面试归来,分享个人面经

知识点总结

三年Java开发,刚从美团、京东、阿里面试归来,分享个人面经

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

片转存中…(img-nKct5zdJ-1712763453708)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-wGfqAytl-1712763453708)]

总结

面试前的“练手”还是很重要的,所以开始面试之前一定要准备好啊,不然也是耽搁面试官和自己的时间。

我自己是刷了不少面试题的,所以在面试过程中才能够做到心中有数,基本上会清楚面试过程中会问到哪些知识点,高频题又有哪些,所以刷题是面试前期准备过程中非常重要的一点。

面试题及解析总结

[外链图片转存中…(img-7j6RrbM2-1712763453708)]

大厂面试场景

[外链图片转存中…(img-59g8hdDS-1712763453709)]

知识点总结

[外链图片转存中…(img-aYk9BjiV-1712763453709)]

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-11BKRIPQ-1712763453709)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值