推荐视频:黑马程序员2022最新SSM框架教程_Spring+SpringMVC+Maven高级
一、Spring注解和xml配置优缺点
引用文章:Spring注解配置和xml配置优缺点比较
注解简单概括:写起来比较简单、方便,看起来也简洁,但是修改麻烦
Xml配置概括:写起来比较灵活、修改方便,但是写和维护麻烦
注解:
优点:
- 简化配置
- 使用起来直观且容易,提升开发的效率
- 类型安全,容易检测出问题
缺点:
- 修改起来比xml麻烦
- 如果不项目不了解,可能给开发和维护带来麻烦
Xml:
优点
- 把类与类之间松解偶;修改方便;容易扩展
- 容易和其他系统进行数据交互
- 对象之间的关系一目了然
缺点
-
配置冗长,需要额外维护;影响开发效率
-
类型不安全,校验不出来,出错不好排查
二、简单使用注解开发
1、开启注解扫描
在xml配置文件中指定注解扫描的位置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
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
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!--开启注解扫描-->
<context:component-scan base-package="com.itheima"/>
</beans>
2、使用注解扫描创建对象
@Component(“id名”)//在Spring容器中创建对象
等价于 <bean id=“bookDao” class=“com.itheima.dao.impl.BookDaoImpl”>
附: 下面四种都可以创建出对象,功能完全一样,只是约定使用的层不同
(1)@Component ——对象创建
(2)@Service——用于业务层的bean对象创建
(3)@Controller——用于表现层的bean对象创建
(4)@Repository——用于数据层的bean对象创建
完全注解开发
附:开启注解扫描也可以使用一个配置类替代
1、开启注解扫描
@Configuration //声明当前类为Spring配置类
//设置bean扫描路径,多个路径书写为字符串数组格式等价于<context:component-scan base-package=“com.itheima”/>
@ComponentScan({“com.itheima.service”,“com.itheima.dao”})
2、使用注解扫描创建对象(同上)
3、加载Spring容器
附:注解开发的作用范围与生命周期管理(了解)
@Scope设置bean的作用范围
//singleton 单实例对象(运行两次都是同一个对象)
//prototype 多实例对象
@PostConstruct设置bean的初始化方法
@PreDestroy设置bean的销毁方法
package com.itheima.dao.impl;
import com.itheima.dao.BookDao;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Repository;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
@Repository
//@Scope设置bean的作用范围
//singleton 单实例对象(运行两次都是同一个对象)
// prototype 多实例对象
@Scope("singleton")
public class BookDaoImpl implements BookDao {
public void save() {
System.out.println("book dao save ...");
}
//@PostConstruct设置bean的初始化方法
@PostConstruct
public void init() {
System.out.println("init ...");
}
//@PreDestroy设置bean的销毁方法
@PreDestroy
public void destroy() {
System.out.println("destroy ...");
}
}
三、【自动装配】
1、@Autowired:根据类型自动装配(注入引用类型)
用反射,不需要set方法
(等价于<bean id=“bookService” class=“org.example.service.Impl.BookServiceImpl” autowire=“byType”/>)
2、根据bean名称装配
@Qualifier(“id名称”):自动装配bean时按bean名称装配
注:@Autowired不能省略
附:
1、自动装配基于反射设计创建对象并暴力反射对应属性为私有属性初始化数据,因此无需提供setter方法
2、自动装配建议使用无参构造方法创建对象(默认),如果不提供对应构造方法,请提供唯一的构造方法
四、注入属性(注解方式)
@Value:注入普通类型属性(如字符串)
给name注入值 “abc” (一般不会这么写)
@Value("abc")
private String name;
@Value一般搭配el表达式使用
1、配置属性源(在spring配置类中).
备注:不支持使用通配符(“*.properties”)——会报错
2、el表达式注入(备注:name的值是从 jdbcproperties中获取的)
@Value("${name}")
private String name;
五、注解开发管理第三方Bean
@Bean 表示当前方法的返回值对象是一个bean(上传到容器中去)
第三方Bean(其他框架或者jar包里面对象)
作用:一般用于Spring整合其他框架,使用其他框架的对象
比如说:我想要将一个数据源对象ds上传/注册到IOC容器中使用,然后在自己的代码中使用
1、创建一个jdbcConfig配置类
(其实也直接写在SpringConfig中,写多一个配置类是为了分类管理配置)
备注:下面只是为了示范,一般ds的内容不是自己写
2、导入刚刚写的配置类到Spring配置类中
@Configuration //声明当前类为Spring配置类
@ComponentScan//开启注解扫描的路径
@Import:导入配置类的信息
3、开始测试
从DataSource.class反射在Spring容器中获取dataSource后可以开始使用
public class App {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
DataSource dataSource = ctx.getBean(DataSource.class);
System.out.println(dataSource);
}
}
优化:第三方bean的属性注入
普通类型的注入就是上面的 用Value+el表达式
引用类型的注入:写在形参的位置,由Spring容器中识别并且自动装配
1、配置数据源(在spring配置类中).
2、注入属性+注册bean对象(DataSource)为Spring容器对象
测试结果:
总结:
专栏文章:
Spring框架(一):概述及简单使用(基于XML方式)