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方法还可以赋值,反射时进行权限变更了?
标签:容器,Autowired,Spring,Bean,笔记,学习,bean,注解,属性 From: https://www.cnblogs.com/darkpar/p/16665484.html