Spring装配Bean的方式

1.在Spring中,装配Bean有三种方式:
(1)在XML中进行显式配置
(2)在java中进行显式配置
(3)隐式的bean发现和自动装配(一般推荐使用自动装配bean的方式)
2.自动装配Bean
(1)实现方式
a.组件扫描:spring会自动发现应用上下文中所创建的bean。
b.自动装配:spring自动满足bean之间的依赖。
3.如何进行组件扫描?
(1)在类上面使用@Component注解,表示该类会作为组件类,并告知spring需要为这个类创建bean。但是你需要知道在spring中组件扫描默认是不启用的,我们需要使用@ComponentScan注解,该注解可以在spring中启动组件扫描。
(2)如果不存在其他的配置,@ComponentScan注解会默认扫描与配置类相同的包。
(3)除了用注解方式启动组件扫描,还可以使用XML来配置启动组件扫描:

默认会扫描base-package包下带有@Component注解的类,并为其创建bean

(4)为组件扫描的bean进行命名
a.spring会根据类名为其指定一个id,规则是将类名的第一个字母变为小写。
b.通过给@Component注解传递参数,比如@Component("user")
c.通过Java依赖注入规范,提供的@Named注解来进行命名,比如@Named("user")
(5)设置组件扫描的基础包
上面提到过我们可以使用@ComponentScan注解或者使用XML来配置基础包:
a.如果需要指定不同的基础包,那么就需要在@ComponentScan注解的value属性指明包的名称,比如@ComponentScan("wonders")
b.如果需要设置多个,可以采用basePackages属性,比如@ComponentScan(basePackages={"a","b"}),其中多个包名的形式为数组的形式。
c.上面两种都是将包名设置为String类型,还可以将其指定为包中所包含的类或者接口,比如:@ComponentScan(basePackageClasses={A.class,B.class})
4.如何进行自动装配?
我们可以使用@AutoWired注解,该注解不但可以用在构造器上和类的任何方法上,还可以用在属性的Setter方法上。
spring会尝试满足方法参数上所声明的依赖,假如有且只有一个bean匹配依赖需求的话,那么这个bean就会被装配起来。如果没有匹配的bean,那么在应用上下文创建的时候,spring会抛出一个异常,为了避免异常出现,可以将@AutoWired的required属性设置为false。spring自动尝试装配的时候,如果没有匹配到,这个bean就会处于未装配的状态,此时需要小心NullPointException的发生。


在我开发FTP上传的时候,将url,username,password等放在properties文件中,想通过@Value("${username}")来取值的时候,获取不到。
首先我的FTP上传是一个工具类,所以我在该类上面添加了@Component注解,这样的话,他就会是一个组建类。
其次我在需要使用上述变量值的时候,声明为private String url,使用@Value注解,通过EL表达式的方式获取不到值。
最后做了修改,给该变量添加了一个set方法,就可以通过@Value获取到properties属性文件中变量的值。
5.如何通过Java代码装配Bean?
(1)创建配置类,使用@Configuration注解,表示该类是一个配置类。
(2)使用@Bean注解创建Bean,该注解会告诉Spring这个方法将会返回一个对象,该对象要注册为spring引用上下文中的bean,方法体重包含了最终产生的bean实例的逻辑。默认情况下Bean的id和@Bean的注解的方法名一致,也可以通过设置@Bean注解的name属性来设置bean的名字。
(3)注入,引用创建bean的方法。默认情况下,spring中的bean都是单例的。
6.如何通过XML来装配Bean?
(1)创建一个xml文件,以<beans>为根元素创建。在使用xml的时候,需要在配置文件的最上部声明多个xml模式,这些文件定义了配置spring的XML元素。
(2)使用<bean>元素来声明一个bean,我们可以给其加一个id,来表示bean的id,class属性表示这个类,并且需要使用全限定的类名。
(3)构造器注入:<constructor-arg>元素或者spring的c命名空间。c命名来声明构造器参数,作为<bean>元素的一个属性。格式如下:

c命名空间

第一个是c:,第二个是构造器参数名,后面是"-ref",最后是要注入的Bean的id
(4)字面量的注入,可以采用<constructor-arg>元素的value属性,表示该属性表明给定的值以字面量的形式注入到构造器中。c命名的方式为c:参数索引来装配相同的字面量值。其中XML不允许某个元素的多个属性具有相同的名字。
(5)集合装配,<list>元素是<constructor-arg>的子元素,表明一个包含值的列表将会传递到构造器中,其中<value>元素用来指定列表中的每个元素。也可以使用<ref bean="">的方式来代替<value>元素。<set>元素也可以,只是<list>和<set>元素还是有区别的,<set>元素会忽略掉所有重复的值,存放顺序也不可以保证。
(6)属性注入,对于强依赖我们一般用构造器注入,对于非强依赖,我们一般选用属性注入的方式。<property>元素name属性和ref属性,通过ref属性来引用bean,通过name属性来注入。其实,我们也可以采用spring 的p命名空间来替代<property>元素。

p-命名空间格式

(7)字面量注入到属性中,<property name="" value="">
(8)集合注入到属性中,使用<list>元素
p-命名空间和c-命名空间的最大区别是:c-命名空间带有"-ref",而p-命名空间是不带有的,以此可以区分是字面量注入还是构造器注入。
7.Spring的util-命名空间
(1)<util:constant>:引用某个类型的public static域,并将其暴露为bean。
(2)<util:list>:创建一个java.util.List类型的bean,其中包含值或引用。
(3)<util:map>:创建一个java.util.Map类型的bean,其中包含值或引用。
(4)<util:properties>:创建一个java.util.Properties类型的bean。
(5)<util:property-path>:引用一个bean的属性,并将其暴露为bean。
(6)<util:set>:创建一个java.util.Set类型的bean,其中包含值和引用。



from:https://www.jianshu.com/p/6eaea5d4b968

发布了233 篇原创文章 · 获赞 1 · 访问量 9158

猜你喜欢

转载自blog.csdn.net/qq_37769323/article/details/104296352