https://blog.csdn.net/weixin_39981912/article/details/79851315#commentBox
Spring是一个开源框架,是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
(IOC)反转控制是Spring的基础, 简单说就是创建对象由以前的程序员自己new构造方法来调用,变成了交由Spring创建对象
两种实现: 依赖查找(DL)和依赖注入(DI)
注:DL已被抛弃,因为他需要用户自己去是使用 API 进行查找资源和组装对象。
在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面(AOP)的编程。
所谓依赖注入,就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中。
1)下载Spring的开发包.
2)创建web项目,引入Spring的开发包
3)引入相关配置文件
创建Spring配置文件,配置创建类
(1)Spring的核心配置文件名称和位置不是固定的,建议放到src下面, 官方建议名称 是applicationContex.xml,但是名称可以随意写
(2)在配置文件中引入schema约束
5)完成配置配置对象创建(这里xml(就是配置文件方式)配置)
- singleton:单例,指一个bean容器只存在一份
- prototype:每次请求(每次使用)创建新的实例,destroy方式不生效
- request:每次http请求创建一个实例且仅在当前request内有效
- session:同上,每次http请求创建,当前session内有效
- global session:基于portlet的web中有效(portlet定义了global session),如果在web中,同session
作用域限定了Spring Bean的作用范围,在Spring配置文件定义Bean时,通过声明scope配置项,可以灵活定义Bean的作用范围。
singleton是默认的作用域,当定义Bean时,如果没有指定scope配置项,Bean的作用域被默认为singleton。singleton属于单例模式,在整个系统上下文环境中,仅有一个Bean实例。也就是说,在整个系统上下文环境中,你通过Spring IOC获取的都是同一个实例。
Spring注入是指在启动Spring容器加载bean配置的时候,完成对变量的赋值行为。
参考博客:https://blog.csdn.net/qq594913801/article/details/80512451
属性注入的方式介绍(三种方式)
(1):使用set方法注入【重点】
(2):使用有参数的构造方法注入【】
(3):使用接口注入
1.使用有参数构造注入属性
2:使用set方法注入属性(重点)
8:注解注入属性:需求:在service中得到dao对象
(1)创建dao和service对象
2)在service类里面定义dao’类型的属性
@Autowired:自动装配 基于@Autowired的自动装配,默认是根据类型注入,可以用于构造器、接口、方法注入
public class Test1 {
private MessageInterface message;
@Autowired //构造器注入
private Test1(MessageInterface message) {
this.message = message;
//省略getter和setter
}
}
public class Test3 {
private MessageInterface message;
@Autowired //setter方法注入
public void setMessage(MessageInterface message) {
this.message = message;
}
public String getMessage() {
return message;
}
}
1:注解开发准备,导包
2:创建类,创建方法
3:创建Spring配置文件,引入约束(注解约束…)
4:注解开发就得,开启注解扫描
.6:创建对象有四个注解(目前这几个的功能都一样,都是创建对象)
@Component
@Controller
@Service
@Repository
实现了Aware系列接口的bean可以访问Spring容器
参考博客:https://cloud.tencent.com/developer/article/1409274
参考博客:https://www.jianshu.com/p/32c3f895a3b5
spring的自动注入有set方法注入和构造器注入,都需要在ioc容器中显示的声明property或contructor.
不显示的声明,可以用bean的自动装配在beans中配置default-autowire="byName/byType/No/Constructor"等。使得bean的ioc容器显得更加简洁。
四种applicationContext.getResource
Resource resource = applicationContext.getResource("config.txt");
Resource resource = applicationContext.getResource("file:D:\\gitee\\immoc\\JUnit\\Spring\\src\\config.txt");
Resource resource = applicationContext.getResource("classpath:config.txt");
Resource resource = applicationContext.getResource("url:http://mini.eastday.com/a/180508073058295.html?qid=01601");
@Controller :注解控制器类(控制层 MVC)
@Service :注解服务类(服务层)
@Repository :注解 DAO 类(持久层)
@Component :将普通的 bean 注解到 spring 容器中,相当于配置文件中的
元注解即是许多 Spring 提供的注解可以作为自己的代码,元注解是一个简单的注解,可以应用到另一个注解(注解的注解)
除了 value() 元注解还可以有其他的属性,允许定制
Spring 可以自动检测类并注册 Bean 到 Applicationcontext 中
component-scan 扫描在base-package包内中带有@Component,@Service,@Controller等注解的bean,并注册到spring容器中。
@Component默认将类名首字母小写作为bean名
@Component(“bean”)自定义bean名为bean
@Scope 表示bean的作用域
默认情况下,类被自动发现并注册 bean 的条件:使用 @Component @Repository @Service @controller 注解或者使用 @Component 的自定义注解;
可以通过过滤器修改默认注解的行为,还可以使用 use-default-filters = "false"
禁用自动发现与注册
学习博客:https://www.cnblogs.com/fnlingnzb-learner/p/9723834.html
https://www.baidu.com/link?url=57aywD0Q6WTnl7XKbIHuE7R_FT8mrDBMv8kdi_tomrzOs6R7FCtwiOakLdJFq644XWwbt8KS1P6B2l8lhWpTNu_-vaeOE7IOeVAvEfJDdXi&wd=&eqid=9073f0df00095bb2000000065d7f2dc5
https://blog.51cto.com/wuwen2011/1542692
@Required:适用于Bean属性的set方法上,bean属性必须在配置时被填充,通过bean定义或自动装配一个明确的属性值。(不常用)
@Autowired:自动注入,一般标识在构造器、set方法、成员变量上。如果找不到注入的实例,则抛出异常,可以通过required=true属性来避免。(如果使用required属性,则使用成员变量时应进行判断是否为空)
注意:每个类的构造器都可以使用@Autowired注解,但只能有一个构造器被标记为Autowired(required=true),required默认为false,这种情况下(解决多个构造器不能使用required属性),@Autowired的必要属性,建议使用@Required注解来代替。
注意:在使用@Service注解注册的bean时,最好如下(使用接口): service s =
applicationContext.getBean(“serviceImpl”);
按类型自动装配可能有多个bean实例的情况,可以使用Spring的@Qualifier注解缩小范围或者指定唯一,也可以用于指定单独的构造器参数或方法参数,也可用于注解集合类型变量;
用法如下:
如果使用bean装配则不需要再Spring XML中配置,直接在bean类中使用 @Qualifier(“beanName”)
如果需要在Spring XML中配置,则在bean标签下添加,然后在bean类中使用@Qualifier(“名称”)
a。@Resource默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入;
b。@Autowired默认是按照类型装配注入的,如果想按照名称来转配注入,则需要结合@Qualifier一起使用;
c。@Resource注解是又J2EE提供,而@Autowired是由spring提供,故减少系统对spring的依赖建议使用@Resource的方式;
基于java的容器注解:
@Bean:由SpringIoc容器配置和初始化对象,类似于XML配置文件的。
(一般@Bean 需要在配置类中使用,即类上需要加上@Configuration注解)
@Bean的name属性:可以通过name属性指定Bean的Id,相当于XML中的Id。
@Component:如果一个类上标识该注解,表示配置类可以通过
@ComponentScan(“路径名”)扫描到该类,并实例化这个类。
@Bean的initMethod属性、destroyMethod属性:通过@Bean实例化Bean时要执行的初始化和销毁逻辑。
property文件是key-value键值对形式的文件
加载资源文件
加载这个文件后,可以再当前文件中采用${jdbc.url}
这种形式来使用配置文件中的内容.
例如:
如果使用注解则:
在类名前加上:
@Configuration
@ImportResource("classpath:/com/acme/propertied-config.xml")
//引入一个资源,对应一个xml文件中包含property_placeholder
在配置文件中使用username的时候需要注意:username输出有时会是登录用户的username,所以一般在配置文件中配置例如jdbc.username的形式以防止混淆.
Spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource
、@PostConstruct
以及@PreDestroy。
@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了。
@Resource有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。
@Resource装配顺序
1. 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
2. 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
3. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
4. 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配;
AOP 即 Aspect Oriented Program 面向切面编程.
首先,在面向切面编程的思想里面,把功能分为核心业务功能,和周边功能。
所谓的核心业务,比如登陆,增加数据,删除数据都叫核心业务
所谓的周边功能,比如性能统计,日志,事务管理等等
周边功能在Spring的面向切面编程AOP思想里,即被定义为切面 。
在面向切面编程AOP的思想里面,核心业务功能和切面功能分别独立进行开发
然后把切面功能和核心业务功能 “编织” 在一起,这就叫AOP。
在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程
AOP的基本概念
@Aspect(切面): 把增强用到具体的方法上面,就是把增强用到切入点上。、通常是一个类,里面可以定义切入点和通知
JointPoint(连接点): 程序执行过程中明确的点,一般是方法的调用
Advice(通知): 增强的逻辑,例如:扩展日志功能,日志功能称为增强
@Before: 标识一个前置增强方法,相当于BeforeAdvice的功能
@After: final增强,不管是抛出异常或者正常退出都会执行。
@AfterReturning: 后置增强,似于AfterReturningAdvice, 方法正常退出时执行
@AfterThrowing: 异常抛出增强,相当于ThrowsAdvice
@Around: 环绕增强,相当于MethodInterceptor
Pointcut(切入点): 带有通知的连接点,在程序中主要体现为书写切入点表达式
AOP Proxy:AOP框架创建的对象,代理就是目标对象的加强。Spring中的AOP代理可以使JDK动态代理,也可以是CGLIB代理,前者基于接口,后者基于子类。
(1):导相关包
(2):创建Spring核心配置文件,导入aop的约束
(3):使用表达式配置切入点
常用的表达式:
execution(<访问修饰符>?<返回类型><方法名>(<参数>)<异常>)
例如:
(1) execution(* cn.itcast.aop.Book.add(..))
(2)execution(* cn.itcast.aop.Book.*(..))
(3)execution(* *.*(..))