Spring-装配bean
一、装配bean
介绍下DI和AOP
DI: 让相互协作的软件组件保持低耦合状态;
AOP: 把应用的各处的功能分离出来形成可重用的组件,能确保POJO的简单性
1.1. 装配bean的三种方式
(1)在XML文件中进行显示配置
(2)在Java中进行显示配置
(3)隐式的bean发现机制和自动装配
1.2. 自动化装配bean
spring从两个角度实现自动化装配:
–组件扫描:Spring会自动发现应用上下文中所创建的bean
–自动装配:Spring自动满足bean之间的依赖
两者组合在一起能让显示配置降低到最少,威力贼大哦
1.2.1 创建可被发现的bean
在类上使用@Component注解则表明这个类 会作为组建类,并且Spring要为这个类创建bean, 所以没必要显示配置该类的bean,Spring会自动帮我们干哦, 但是组件扫描默认是不启用的,我们需要显示配置Spring,才能找到@Component注解的类并为其创建bean,@ComponentScan注解可以在Spring中启用组件扫描,如果没有其他配置的话,该注解默认会扫描于配置类相同的包,当然啦,我们也可以使用XML来启用组件扫描,code isas follow:
1.2.2 对组件扫描的设置
1.2.2.1 为bean命名
@Component 没有明确的设置ID的话,会根据类名指定ID,通常就是讲类名的第一个字母小写,显示的配置ID@Component(“IDName”),还有种为bean命名的方式,这种方式不适用@Component注解,使用Java依赖注入规范中提供的@Named注解为bean设置ID,大多数情况下这两种方式是可以互换的,建议用第一种
1.2.2.2 设置组件扫描的基础包
默认的话@Component会将配置类的包作为基础包来扫描组件,如果想扫描别的包的话,我们可以采用将@ComponentScan注解中的value属性中指明包的名称 两种方式@Component(“packageName”)或者@Component(basePackages=”packName”)可以设置多个基础包哦,设置方式就是将basePackages属性设置为要扫描包的数组就行了,eg:@Component(basePackages={“name1”,”name2”, ····})这种方式可能会出错哦@Component提供另外一种方式设置就是@Componenet(basePackageClasses={类1.class, 类2.class, ·······}) 这种稳妥哦
1.2.2.3 为bean添加注解实现自动装配
@Autowired注解(可以用在构造器上,也可以用在Setter方法上),如果没有匹配的bean,在应用上下文创建的时候,Spring 会抛出异常的哦, 你可以将@Autowired的required属性设为false:@Autowired(required= false),使用这个后千万要检查代码中有没有进行null检查哦,不然可能会出现NullPointerException异常哦
简单介绍下@Inject注解吧, 这个注解来自于Java依赖注入规范,这个规范同时提供了@Named注解,Spring支持@Autowired和@Inject两种注解,前者是Spring专属的哦,两者之间有着一些细微的差别,这就不介绍了,但是大多数情况下,这两者是可以互换的
1.3 通过Java代码装配bean
进行显示配置的时候,JavaConfig是十分强大的,强大、类型安全并且对重构友好,JavaConfig中不应该包含任何业务逻辑,也不能放入业务逻辑,通常放入单独的一个包中
1.3.1 创建配置类
在类的前面还是加@Configuration 注解声明这个是配置类, for example:
@Configuration
public class Test(){
}
1.3.2 声明简单的bean
编写一个方法用以创建所需类型的实例,然后加上@Bean注解(告诉spring这个方法会返回一个对象,这个对象要注册一个bean),默认bean的ID与@Bean的方法名一致,可以更改, @Bean(name=”newName”) , for example:
@Bean(name = "newTest")
public Test setMusic(){
return new Test();
}
1.3.3 通过JavaConfig实现注入
1.4 通过xml配置bean
1.4.1 创建xml配置规范
//xml的简单配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
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">
<!-- write the details in here-->
</beans>
1.4.2 声明一个简单的< bean >
<!-- 格式-->
<bean id = " " class = " "/>
如果没有给定id的值,这个bean会根据全限定类名来进行命名,for instance:
<bean class = "test"/>
<!--
这里的id就是test#0
#0是个计数形式,用以区分其他类型的bean
通常还是自定义id比较好,虽然自动化生产id比较方便
-->
1.4.3 借助构造器注入初始化bean
两种方式:
-----< constructor-arg>元素
-----spring3.0的c-命名空间
两种方式的优缺点:前者的比较冗长,但是能实现的事情比较多,后者简单,但是有些前者能实现的事情它不能实现
前者注入:
<bean id="" class="">
<constructor-arg ref=""></constructor-arg>
</bean>
后者注入:
<!--需要在xml顶部声明c命名空间-->
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:c="http:www.springframework.org/schema/c"
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">
<bean id="" class="" c: name-ref=""></bean>
<!--
声明c命名空间不要忘了哦
前缀 c:
-ref 是命名约定,这个会告诉spring正在装配的是bean的引用
-->
</beans>
通过xml配置bean接下来太多了 ,我就不继续写了 有想知道的百度spring的装配基于 xml即可了解