Spring配置文件引入外部属性
引入数据库和Druid的依赖
在配置文件中配置DataSource的bean
直接配置属性
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/test?serverTimezone=UTC"/>
<property name="password" value="123456"/>
<property name="username" value="root"/>
</bean>
将属性放入properties文件中,然后引入该文件,通过${key}的方式取值
创建resource bundle(资源包)文件,以entry格式把属性填进去
然后引入新标签context:property-placeholder 和之前在mybatis中引入properties文件类似
<context:property-placeholder location="jdbc.properties"
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value=${jdbc.driver}/>
<property name="url" value=${jdbc.url}/>
<property name="password" value=${jdbc.password}/>
<property name="username" value=${jdbc.username}/>
</bean>
Bean的作用域
单例和多例
bean标签中的scope属性可以设置bean的作用域,分别为singleton或prototype,两者表示单例和原型(多例)
在WebApplicationContext环境下时还有两个作用域request和session
Bean的生命周期
bean可以配置属性init-method destroy-method
ConfigurableApplicationContext是ApplicationContext的子接口,扩展了关闭和刷新容器的方法。
bean的生命周期与作用域有关
当scope为singleton时:
获取ioc容器就会创建该bean,实例化 依赖注入 初始化
关闭容器时会销毁bean对象,调用destroy-method配置的方法
当scope为prototype时:
只有getBean时才会创建对象,实例化 依赖注入 初始化
并且关闭容器时不会销毁对象。
Bean的后置处理器
后置处理器会在初始化前后执行额外操作
需要额外写一个类,实现BeanPostProcessor接口,然后将这个类配置到IOC容器的bean中,就会对容器内所有的bean产生效果
该接口中有两个方法,一个是初始化前,一个是初始化后,可以在方法中进行操作。
FactoryBean
一个类实现FactoryBean接口,然后配置到ioc的bean中,就可以得到工厂返回的类型,不需要进行Bean类型的配置。
这个接口有三个函数,getObject getObjectType isSingleton
基于XML的自动装配
自动装配:根据指定的策略,在IOC容器中匹配某个Bean,自动为bean中的类类型的属性或接口类型的属性赋值。
bean标签中有autowire属性,不装配:no|default 根据类型:byType 根据名字:byName
byType时,ioc容器中,每个类或接口只能有一个符合类型的bean
byName时,当ioc容器中有bean的id与属性名相同时会自动装配
基于注解管理Bean
将类标识为组件的常用注解
@Component 标识为普通组件
@Controller 标识为控制层组件
@Service 标识为业务层组件
@Repository 标识为持久层组件
功能都一样,都是加到bean中,互为别名
加到实现类上,不要加到接口上
扫描注解
添加注解后需要在ioc的配置文件中添加扫描标签
<context:component-scan base-package="com.darkpar"></context:component-scan>
扫描标签中的过滤器
<context:component-scan base-package="com.darkpar">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller">
</context:component-scan>
上面是排除指定注解类型,即不扫描Controller注解的类,expression中填写注解的全类名
exclude-filter或include-filter,分别是排除过滤器和只扫描过滤器
在使用include-filter时,需要在context:component标签中设置属性use-default-filters为false
use-default-filters属性,为true时扫描所有文件(默认),为false时不扫描任何文件
type也可以设置为assignable,expression中填写全类名,过滤指定的类型
通过扫描的Bean的ID
默认为类名首字母小写
可以在注解的value中设置id
基于注解的自动装配
在成员变量上添加注解@Autowired,此时不需要添加set方法
在set方法上添加注解@Autowired
在构造方法上添加@Autowired
@Autowired原理
默认通过byType方式,在IOC容器中通过类型匹配bean
当有多个类型匹配的bean时,会按byName方式进行匹配
当有多个类型匹配的bean且都不与属性名相同时,会抛异常
此时可以在使用@Autowired的属性上添加注解@Qualifier(“name”)此时可以按byName方式找到唯一的bean
基于注解自动装配时,默认是如果没有能够匹配的bean时,会抛异常,基于xml的则是不能匹配就按默认值赋值
其中@Autowired注解中有required属性,注解时默认为true,即必须有匹配的bean,而xml时相当于false
疑问:为什么在成员变量上没set方法还可以赋值,反射时进行权限变更了?
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话