tag: spring
categories: 技术
在DAO中配置JDBC 坑爹笔记
正确配置(自动装配):
1 |
|
1 | <context:component-scan base-package="com.runsstudio.dao"/> |
万万不可的配置:
1 | ApplicationContext ioc=new ClassPathXmlApplicationContext("com/runsstudio/conf/applicationContext.xml"); |
会造成重复扫包
tag: spring
categories: 技术
正确配置(自动装配):
1 | @Autowired |
1 | <context:component-scan base-package="com.runsstudio.dao"/> |
万万不可的配置:
1 | ApplicationContext ioc=new ClassPathXmlApplicationContext("com/runsstudio/conf/applicationContext.xml"); |
会造成重复扫包
连接池基本的思想是在系统初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象。使用完毕后,用户也并非将连接关闭,而是将连接放回连接池中,以供下一个请求访问使用。而连接的建立、断开都由连接池自身来管理。同时,还可以通过设置连接池的参数来控制连接池中的初始连接数、连接的上下限数以及每个连接的最大使用次数、最大空闲时间等等,也可以通过其自身的管理机制来监视数据库连接的数量、使用情况等。
1 | package com.runsstudio.test; |
导包
写配置
spring配置文件中,集合了IOC容器管理的所有组件
源码(src)包下,右键创建一个spring configuration文件
1 | <?xml version="1.0" encoding="UTF-8"?> |
1 | package com.runsstudio.test; |
结果:Person{name=’菜龙’, email=‘220@qq.com‘, QQ=1165, gender=’male’}
我们没有创建对象,但是却获取了对象
存在的几个问题:
src 源码包开始的路径:称为类路径的开始
导入包必须5个一起导
先导包在创建配置文件
Spring容器接管了xml文件之后,xml文件会有一个小叶子 不然是没有的
几个细节:
ApplicationContext(IOC容器的接口) 有两个儿子,一个是ClassPathXmlApplicationContext 表示XML文件配置文件在类路径下,另一个是FileSystemXmlApplicationContext(“f://IOC.xml”),表示XML文件配置在文件系统下
XML文件最好是放在src路径下,不要和bean放一起
Bean的对象是什么时候创建好的?new ClassPathXmlApplicationContext,创建容器的时候创建的,所以不用等到get的时候再创建对象
由于上面的特性,使用同一个组件,获取两次容器的对象,获取的地址是一样的,也就是说,同一个组件在IOC容器中是单实例的
如果要获取不存在的对象,比如Person person01 =(Person) ioc.getBean(“person21”); 会报org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named ‘person21’ available
最后一个细节,用property赋值一定是调用getter setter来赋值的
javaBean的属性名是由什么决定的?getter setter,首字母小写就是属性名
最新方法:使用JAVA配置取代XML
最核心的注解:
@Configuration
,作用在类上,相当于一个xml配置文件
@Bean
作用在方法上,相当于xml配置中的
使用注解配置spring 实现IOC功能
BookServlet
1 | @Controller |
BookService
1 | @Service |
BookDao
1 | @Repository() |
XML
1 | <context:component-scan base-package="com.runsstudio" use-default-filters="true"></context:component-scan> |
调用Servlet…
调用service….
调用DAO,保存了一本图书
只需要@Autoware 然后就再也不需要new啦!
@Autowired 首先看属性的类型,比如说
1 | @Autowired |
首先找到对应组件。对应的java代码是ioc.getBean(BookService);
如果没找到,抛出No such bean exception
如果找到多个(比如说有继承关系的子类),继续找,顺序是:
成员变量名作为id继续匹配
1 | <!--Spring有四个注解: |
使用注解将组建快速加到容器中,需要几步:
给要天天加的组件上标四个注解的任何一个
告诉Spring自动扫描加了注解的组件:依赖名称空间进行扫描,默认是单例的
<context:component-scan base-package="com.runsstudio"></context:component-scan>
注意需要先添加命名空间
指定base-package,该包下面的所有注解类自动扫描进IOC容器。
如果要支持用注解导入组件,一定要导入AOP包(spring-aop-5.2.0.RELEASE),支持注解模式
从组件中加入的和从包中加入的,行为都是一样的
com.runsstudio 及下面所有加了注解的类都会被扫描
BeanDefinitionStoreException这里可能会包一个错误
1 | @Test |
1 | @Repository("bookDaoheihei") // 指定新的 bookDao名字 |
1 | @Scope("prototype") //指定是多实例的 |
由于可以用注解快速配置, XMLbean配置的方法适用于配置其他人写的包(无法修改java代码)
1 | <context:exclude-filter type="(排除的规则)" expression=""/> |
【掌握】
assignalble 全类名
annotation 注解排除
【了解】
aspectJ aspectJ表达式
custom 自定义代码特定决定哪些自己使用
regex 正则表达式
1 | <context:component-scan base-package="com.runsstudio" use-default-filters="false"> <context:include-filter type="custom" expression="org.springframework.stereotype.Controller"/></context:component-scan> |
注意 使用include的时候要禁用掉默认的规则use-default-filters=”false”
@Autowired Spring
@Resource J2EE,是JDK的标准
@Inject
三个都是JAVA的标准,不过是开发公司不同
Resource 扩展更强:如果切换成另外一个容器框架,Resource还是可以使用的,Autowired 是Spring开发,离开Spring就不能用了
javaBean(基本类型)
(自定义类型的属性是一个对象,这个对象在容器中可能存在)
1 | <bean id="car" class="com.runsstudio.bean.Car"> |
1 | Person bean = ioc.getBean(Person.class); |
输出:
Person{name=’null’, email=’null’, QQ=0, gender=’null’, flag=false, car=Car{carName=’1’, price=null}, carList=null, maps=null, properties=null}
但是这里还需要一个
我们有时候不想写这么多,希望来一个自动装配,
所以有一个autowire属性
1 | autowire="default"表示不自动装配 |
在SpEL中使用字面量、引用其他bean、引用其他bean的某个属性值、调用非静态方法、调用静态方法、使用运算符
用#{}来表达
#{12*5}
#{book01.bookname}
#{car}
调用静态方法 #{T(全类名).random().toString()}
调用非静态方法 #{对象.方法名()}
面向切面编程是一种新的编程思想,AOP基于OOP,在程序运行期间,将某段代码动态地切入(插入)到指定方法的指定位置进行运行,这种编程方式称为面向切片编程。
场景:计算器运算计算方法的时候记录日志。
要加日志记录,就有非常多的方法
(1)直接编写在方法内部,这样就会变成 日志->方法->日志 的过程,修改维护麻烦,而核心功能是【业务逻辑】这种状态就是耦合
(2)也有把记录日志功能抽取出来的,LogUtils 功能
我们希望的是方法里一个代码都没有 全删掉,却保留日志功能