Spring
2021-08-27 09:35:46 50 举报
AI智能生成
第一版Spring
作者其他创作
大纲/内容
什么是Spring
是一个框架,核心技术:IoC,AOP。实现解耦合
spring是一个容器,容器中存放的是java对象,是把对象放到容器当中
怎么使用spring
把项目中用的对象放到容器中
由容器进行对象创建,由容器管理对象之间的关系(属性赋值)
在程序中从容器中获取要使用的对象
什么样的对象会放入容器中
dao类、service类、controller类、工具类
1,xml配置文件
2,注解方式
spring中的对象默认是单例的,在容器中这个名字的对象只有一个
什么样的对象不放到spring容器
1,实体类对象,实体类数据来自数据库
不能由程序员自己创建的对象
2,servlet、listener、filter
使用Spring框架步骤
1,加入Spring依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
2,创建类:接口、实现类,没有接口的类
3,创建spring的配置文件
使用<bean>声明对象
使用<bean>声明对象
<bean id=对象的自定义名称 class=类的全限定名称></bean>
声明bean=创建java对象,所以必须要确定创建java对象的名字和类型。
bean的id就相当于变量名,class就是告诉spring要创建什么类型的对象
bean的id就相当于变量名,class就是告诉spring要创建什么类型的对象
4,获取ApplicationContext对象
通过该对象获取容器中的java对象
通过该对象获取容器中的java对象
ApplicationContext是一个接口,可以通过其实现类ClassPathXmlApplicationContext进行实例化
String config = "beans.xml";配置文件名
ApplicationConext context = new ClassPathXmlApplicationContext(config);
创建spring容器对象,此时spring会将容器中声明的所有bean进行实例化
创建spring容器对象,此时spring会将容器中声明的所有bean进行实例化
5,通过容器context/ac的getBean(id值)取出指定的对象
SomeService service = context.getBean("service",SomeService.class);
获取容器中对象的时候,可以传入其class属性,就不需要强转
获取容器中对象的时候,可以传入其class属性,就不需要强转
SomeService service = (SomeService)context.getBean("service");
这里的service就是在配置文件beans.xml声明的<bean>标签中的id值
这里的service就是在配置文件beans.xml声明的<bean>标签中的id值
ApplicationContext的一些方法
获取容器中定义对象的数量
int num = context.getBeanDefinitionCount();
获取容器中每个对象的id值
String[] ids = context.getBeanDefinitionNames();
核心技术
IoC:控制反转
1,理论、思想、概念:指导开发人员在容器中,在代码之外管理对象,给属性赋值,管理依赖
2,IoC技术实现使用的是DI(依赖注入):在项目中提供对象的名称,对象的创建、查找和赋值有容器内部自己实现
3,spring使用的DI,底层使用的是反射机制
DI给属性赋值
1,set注入(设置注入):spring调用类中属性的set方法实现属性赋值
1,简单类型set注入<property name=属性名 value=属性值/>
2,引用类型set注入<property name=属性名 ref=bean的id/>
2,构造注入:spring调用类的有参构造方法实现属性赋值
1,简单类型:<property constructor-arg name=属性名 value=属性值/>
2,引用类型:<constructor-arg name=属性名 ref=bean的id/>
3,自动注入
spring根据某些规则,给引用类型赋值,常用的有ByName、byType
1,byName:按名称注入,java类中引用类型的属性名和容器中bean的id相同,数据类型相同,这样的bean可以自动赋值给引用类型
2,byType:按类型注入,java类中【引用类型】和bean的【class】是同类的,这样的bean可以自动赋给该引用类型属性
常用注解
1,@Component:创建对象,value=bean的id
2,@Repository:创建dao对象,用来访问数据库
3,@Service,创建Service对象,处理业务逻辑,可以有事务功能
4,@Controller:创建控制器对象,接受请求,显示处理结果
5,@Value:简单类型的属性赋值
6,@Autowired:引用类型的赋值注解,支持byName,byType,默认是byType
7,@Resource:jdk注解,使用自动注入赋值引用类型,支持byName、byType,默认是byName
8,注解的使用步骤
1,加入依赖:spring-context,间接加入spring-aop
2,在类中接入注解
3,在spring的配置文件中,加入组件扫描器的标签<context:conponent-scan base-package=扫描包名
ioc能实现解耦合
能够实现对象之间的解耦合,列入service和dao对象之间的解耦合
aop:面向切面编程
底层是动态代理
1,jdk动态代理
使用jdk反射包中的类实现创建代理对象的功能
要求:目标类必须实现接口
2,cdlib动态代理
使用第三方工具库,实现代理对象的创建
要求:目标类必须可以被继承,不能使final
原理:继承目标类,在子类中重写目标类的方法,实现方法增强
aop:是动态代理的规范化,对动态代理的实现步骤进行规范
aop作用:
1,在目标类不修改源代码的情况下,增加功能
2,减少重复的代码
3,专注业务功能的实现
4,解耦合:将业务功能和日志等非业务功能的耦合
什么时候考虑使用aop技术?
1,存在的类功能不完善,可以使用aop进行增加
2,给多个类增加相同的功能
3,给业务方法增加事务、输出日志
aop的实现框架:
1,spring实现了aop,实现方式是接口
2,aspectj框架
1,使用注解实现aop功能
2,使用xml配置文件中的标签实现aop功能
aop中的概念;
1,aspect:切面,表示给业务方法增加的功能,一般的日志输出、事务、权限检查等是切面功能
2,pointcut:切入点,是一个或多个JoinPoint的集合,表示切面功能执行的位置
3,advice:通知,也叫增强,表示切面功能执行的时间,在方法前、方法后等
aspectj框架的使用
1,表示切面的执行时间,使用的通知注解
1,@Before:前置通知,在目标方法之前先执行
2,@AfterReturning:
后置通知,在目标方法之后执行,能够获得目标方法的返回结果,但不能修改。
目标返回结果作为一个Object参数
后置通知,在目标方法之后执行,能够获得目标方法的返回结果,但不能修改。
目标返回结果作为一个Object参数
3,@Around:环绕通知,在目标前后都可以,相当于jdk动态代理
4,@AfterThrowing:异常通知,在目标方法出现异常时执行
5,@After:最终通知,总会被执行的代码,可以用来释放资源
6,@Pointcut:定义和管理切入点的辅助注解
7,代理的使用方法:
1,目标类有接口,默认使用jdk动态代理,
<aop:aspectj-autoproxy/>
<aop:aspectj-autoproxy/>
2,目标类没有实现接口,使用cglib动态代理
3,可以在spring中声明,不管有没有接口都使用cglib,
<aop:aspectj-autoproxy proxy-target-class="true"/>
<aop:aspectj-autoproxy proxy-target-class="true"/>
2,表示切面功能的切入点表达式:execution(访问修饰符 返回值 包名.类名.方法名称(方法的参数) 异常)
spring整合mybatis
整合想法:使用spring的ioc核心技术,将mybatis框架中使用的对象交给spring统一创建和管理,
spring是容器,存放项目中要使用的service对象、dao对象和工具类对象等
spring是容器,存放项目中要使用的service对象、dao对象和工具类对象等
交给spring的mybatis对象
1,数据源DataSource,使用阿里公司的Druid连接池
2,SqlSessionFactory对象,使用的SqlSessionFactoryBean在内部创建SqlSessionFactory
3,Dao代理对象,使用的是MapperScanConfigure,
在这个类的内部使用getMapper(),创建dao接口的动态代理类对象
在这个类的内部使用getMapper(),创建dao接口的动态代理类对象
0 条评论
下一页