spring ioc入门(自用笔记,仅供参考,欢迎讨论)

spring的文档看的让人发晕。。
https://docs.spring.io/spring/docs/5.1.4.RELEASE/spring-framework-reference/core.html#beans-introduction
但是没办法,还是要看。。来吧
1.1介绍了IOC(DI)解释不清楚,看到代码再说

文档这句写了ioc的包。(然而最后测试时候用了不止这2个)
The org.springframework.beans and org.springframework.context packages are the basis for Spring Framework’s IoC container

这句说bean的实例化装配由容器完成
A bean is an object that is instantiated, assembled, and otherwise managed by a Spring IoC container

1.2
那么容器通过什么来实例化bean呢,有个接口 org.springframework.context.ApplicationContext

再看下面,通过这2个来实现接口
it is common to create an instance of ClassPathXmlApplicationContext or FileSystemXmlApplicationContext

1.2.1 下面的例子介绍了xml配置元数据的方法
The following example shows the basic structure of XML-based configuration metadata:
在这里插入图片描述
id是标示符,class是类的全名。

1.2.2
实例化容器:
读取了2个xml的配置文件:
在这里插入图片描述
services.xml配置文件中
容器初始化了一个PetStoreServiceImpl的实例化对象,id=petStore。但是这个过程需要传入2个参数(property)
accountDao对象来自accountDao类,itemDao对象来自itemDao类
在这里插入图片描述
再往下看
daos.xml配置文件中
容器初始化了2个对象,accountDao,itemDao,分别和上面对应。
在这里插入图片描述
简单的说,当需要PetStoreServiceImpl的时候,容器通过配置文件的关联,自己生成需要的参数(accountDao,itemDao),而不需要我们new一个accountDao,再new一个itemDao,最后再去生成 PetStoreServiceImpl了

下面说可以读取多个配置文件,或者在一个配置文件中,import其他的配置文件,
在这里插入图片描述
有一定的约束,先略

1.2.3 Using the Container
当实例化了容器后,当然要使用它
在这里插入图片描述
第一步是初始化容器
第二步通过容器的getBean获得 id=petStorede(实际的类是PetStoreServiceImpl)的实例化对象 Service,
最后 使用service对象

那么到这里,整个逻辑就串联起来了。测试一下看看。
比如要实现保存用户名和密码的程序,(演示spring不涉及数据库)
为了拓展和分层,具体保存的业务逻辑封装在另一类中,而再这之前,数据库的操作先实现接口

我需要一个实体类(entity.User)
需要一个服务类(service.UserService)
需要一个数据库接口(dao.UserDAO)以及对应的实现类(daoImpl.UserDAOImpl)
在实现类中保存数据,这时,服务类调用实现类的对象来操作保存的业务。

先不加入spring,看下代码

实体类(entity.User)
在这里插入图片描述
数据库接口(dao.UserDAO)
在这里插入图片描述
以及对应的实现类(daoImpl.UserDAOImpl)
在这里插入图片描述
服务类(service.UserService)
在这里插入图片描述
测试方法
在这里插入图片描述

结果
在这里插入图片描述
**

看代码的话感觉服务类和接口实现类的功能非常接近,但是服务类不光有保存的方法,还可以有其他的业务逻辑,而接口实现类只处理和数据库相关的功能,当需要换数据库的时候,只要换一套新的实现类即可,服务类new新的实现类即可,其他都不需要改了。再想想spring ioc是干嘛用的?简单来说,就是帮我们new对象,这样一来,service完全都不用改了,直接在spring的配置文件改下就好了。维护和拓展的可操作性大大提高了。

**

接下来引入spring,先观察一下,哪些对象可以通过spring来配置
第一个在测试类中的服务类(UserService),同时,这个类初始化的时候需要一个参数(property):实现类的对象(UserDAOImpl),这个是第二个。
按这个逻辑来做配置文件:
在这里插入图片描述
引入jar包
在这里插入图片描述

UserService 类中userDAOImpl不需要我们来new了。
在这里插入图片描述
测试类代码
在这里插入图片描述

报错
在这里插入图片描述
加入commons-logging-1.1.3.jar
加入spring-expression-5.1.4.RELEASE.jar

结果:
在这里插入图片描述
那么到此,最基本的ioc就实现了。

下面增加基于注解的简单测试:
文档写的太全面,就不按文档来了,先从最简单测,遇到再追加。

1,配置文件只要这2句就可以了(注意上面的namespace有增加)
在这里插入图片描述
2.@component 没有写参数默认就是类名首字母小写 @component(“userService”) 相当于bean id=userService
@resource 就是@resource(name=“userDAO”) 相当于 property name=“userDAO”
在这里插入图片描述
那么上面那个userDAO从哪里拿?所以实现类上也要@component
在这里插入图片描述
@resource和@component是如何匹配上的呢?
@resource,默认是userDAO,
@component,默认是UserDAOImpl2

我都没有带参数,默认的名字不同 但是测试通过,
那么我再创建了一个@component,默认是UserDAOImpl, 这样有2个实现类,测试 失败。
我再在其中一个@component 加入参数@component (“userDAO”) 测试成功
那么结论就是,如果不带参数,先按名字匹配,找不到再按类型,如果类型重复,就报错


下面的无视,spring的文档真心难看


1.3.1,bean可以起别名?
1.3.2
Instantiation with a Static Factory Method
主要讲述特殊情况下bean的配置,估计不常用,先略。
在这里插入图片描述
Instantiation by Using an Instance Factory Method
在这里插入图片描述
多个工厂方法
在这里插入图片描述
下面这个等同于静态工厂?在这里插入图片描述
含参构造器,多个参数的情况要避免歧义。

下面这个情况,假设ThingTwo和ThingThree类不是通过继承来关联的
在这里插入图片描述
再看这个
在这里插入图片描述
通过类型
在这里插入图片描述
通过参数索引
在这里插入图片描述
通过构造参数名字
在这里插入图片描述
1.4.2.
直接设置值的情况,看这个值就知道是jdbc的参数
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值