Spring Bean 配置说明
bean的几种装配方式的基本用法
bean的几种装配方式的基本用法Bean的装配方式是Spring框架中用于实现对象依赖注入的一种机制。
Spring提供了多种装配方式,包括XML配置、注解配置和Java代码配置。
下面将分别介绍这几种装配方式的基本用法。
1.XML配置方式XML配置方式是Spring最早的装配方式之一,需要在XML文件中明确描述Bean的定义和依赖关系。
以下是XML配置的基本用法:- 在XML文件中使用`<bean>`元素定义Bean,可以指定Bean的类名、属性值、构造函数参数等。
- 使用`<property>`元素设置Bean的属性值,可以通过`ref`属性引用其他Bean。
- 使用`<constructor-arg>`元素设置Bean的构造函数参数,同样可以通过`ref`属性引用其他Bean。
2.注解配置方式注解配置方式是Spring 2.5引入的一种装配方式。
通过在Bean的类或者方法上添加注解,Spring能够自动完成对象的创建和依赖注入。
以下是注解配置的基本用法:3. Java代码配置方式Java代码配置方式是从Spring 3.0开始引入的,通过编写Java代码来配置Bean和依赖关系。
以下是Java代码配置的基本用法:- 在方法体中可以进行复杂的逻辑处理来创建Bean,并可以通过参数注入其他Bean。
以上是XML配置、注解配置和Java代码配置这三种装配方式的基本用法。
根据实际的需求和项目的规模,可以选择相应的装配方式来完成对象的管理和依赖注入。
在实际开发中,通常会结合使用这三种方式来完实现Bean的装配。
bean使用方法
bean使用方法Bean是Java中重要的概念之一,它是一种可重复使用的软件组件,具有独立性和可插拔性。
在Java开发中,Bean通常用于封装数据和业务逻辑,使得代码更加模块化、可维护和可扩展。
本文将介绍Bean的使用方法,包括创建Bean、设置属性和使用Bean的实例等。
一、创建Bean在Java中,创建Bean有多种方式,最常见的是使用类来定义Bean。
首先,我们需要创建一个类,该类可以包含属性和方法。
然后,我们可以使用该类来创建Bean的实例。
例如,我们可以创建一个名为Person的类,并定义属性name和age:public class Person {private String name;private int age;// 构造方法public Person(String name, int age) { = name;this.age = age;}// getter和setter方法public String getName() {return name;}public void setName(String name) { = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}}二、设置属性创建Bean的实例后,我们可以使用setter方法来设置Bean的属性。
setter方法通常具有以下形式:setXxx(),其中Xxx是属性的名称。
例如,我们可以使用以下代码设置Person的属性:Person person = new Person();person.setName("张三");person.setAge(20);三、使用Bean的实例创建并设置Bean的属性后,我们可以使用Bean的实例来调用其方法。
例如,我们可以使用以下代码获取并输出Person的属性:System.out.println("姓名:" + person.getName());System.out.println("年龄:" + person.getAge());四、使用Bean的注意事项在使用Bean时,需要注意以下几点:1. Bean的属性应该具有合适的访问修饰符,一般为private,以保证数据的封装性。
bean的几种装配方式的基本用法
bean的几种装配方式的基本用法Bean的几种装配方式的基本用法在Spring框架中,Bean是一个重要的概念,它代表了应用程序中的一个组件。
Bean可以通过不同的装配方式来实现依赖注入,从而实现组件之间的解耦。
本文将介绍几种常见的Bean装配方式及其基本用法。
一、XML配置文件装配1.1 基本概念XML配置文件是Spring框架最早支持的一种Bean装配方式。
通过在XML配置文件中定义Bean的属性和依赖关系,Spring容器可以自动创建和管理这些Bean。
1.2 基本语法在XML配置文件中,使用<bean>标签来定义一个Bean。
其中包含以下属性:- id:指定该Bean在容器中的唯一标识符;- class:指定该Bean对应的Java类;- scope:指定该Bean在容器中的作用域;- property:指定该Bean所依赖的其他Bean。
例如:<bean id="userService" class="erService"><property name="userRepository" ref="userRepository"/> </bean>上述代码定义了一个名为“userService”的Bean,它对应Java类“erService”,并依赖于名为“userRepository”的另一个Bean。
1.3 优缺点分析XML配置文件装配方式具有以下优点:- 配置灵活:可以通过修改XML配置文件来改变应用程序的行为;- 易于理解:XML配置文件的结构清晰,易于理解和维护。
但是,XML配置文件装配方式也存在以下缺点:- 冗长:XML配置文件需要编写大量的重复代码,增加了开发者的工作量;- 容易出错:由于XML配置文件中的内容是静态的,容易出现因修改不及时而导致的错误。
spring中bean配置和bean注入
spring中bean配置和bean注⼊1 bean与spring容器的关系Bean配置信息定义了Bean的实现及依赖关系,Spring容器根据各种形式的Bean配置信息在容器内部建⽴Bean定义注册表,然后根据注册表加载、实例化Bean,并建⽴Bean和Bean的依赖关系,最后将这些准备就绪的Bean放到Bean缓存池中,以供外层的应⽤程序进⾏调⽤。
1 bean配置bean配置有三种⽅法:基于xml配置Bean使⽤注解定义Bean基于java类提供Bean定义信息1.1 基于xml配置Bean对于基于XML的配置,Spring 2.0以后使⽤Schema的格式,使得不同类型的配置拥有了⾃⼰的命名空间,是配置⽂件更具扩展性。
①默认命名空间:它没有空间名,⽤于Spring Bean的定义;②xsi命名空间:这个命名空间⽤于为每个⽂档中命名空间指定相应的Schema样式⽂件,是标准组织定义的标准命名空间;③aop命名空间:这个命名空间是Spring配置AOP的命名空间,是⽤户⾃定义的命名空间。
命名空间的定义分为两个步骤:第⼀步指定命名空间的名称;第⼆步指定命名空间的Schema⽂档样式⽂件的位置,⽤空格或回车换⾏进⾏分分隔。
1.1.1 Bean基本配置在Spring容器的配置⽂件中定义⼀个简要Bean的配置⽚段如下所⽰:⼀般情况下,Spring IOC容器中的⼀个Bean即对应配置⽂件中的⼀个<bean>,这种镜像对应关系应该容易理解。
其中id为这个Bean的名称,通过容器的getBean("foo")即可获取对应的Bean,在容器中起到定位查找的作⽤,是外部程序和Spring IOC容器进⾏交互的桥梁。
class属性指定了Bean对应的实现类。
下⾯是基于XML的配置⽂件定义了两个简单的Bean:<?xml version="1.0" encoding="UTF-8" ?><beans xmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans-3.0.xsd"><bean id="car" name="#car1" class="com.baobaotao.simple.Car"></bean><bean id="boss" class="com.baobaotao.simple.Boss"></bean></beans>1.1.2 依赖注⼊1. 属性注⼊2. 构造函数注⼊3. ⼯⼚⽅式注⼊1.2 使⽤注解定义Bean我们知道,Spring容器成功启动的三⼤要件分别是:Bean定义信息、Bean实现类以及Spring本⾝。
Spring常用的一些注解说明
Spring常⽤的⼀些注解说明@Configuration从Spring3.0,@Configuration⽤于定义配置类,可替换xml配置⽂件,被注解的类内部包含有⼀个或多个被@Bean注解的⽅法。
这些⽅法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进⾏扫描,并⽤于构建bean定义。
@Bean@Bean注解⽤于告诉⽅法,产⽣⼀个Bean对象,然后这个Bean对象交给Spring管理。
产⽣这个Bean对象的⽅法Spring只会调⽤⼀次,随后这个Spring将会将这个Bean对象放在⾃⼰的IOC容器中。
SpringIOC 容器管理⼀个或者多个bean,这些bean都需要在@Configuration注解下进⾏创建,在⼀个⽅法上使⽤@Bean注解就表明这个⽅法需要交给Spring进⾏管理。
@Autowired、@Resource@Resource和@Autowired注解都是⽤来实现依赖注⼊的。
只是@AutoWried按by type⾃动注⼊,⽽@Resource默认按byName⾃动注⼊。
♣ @Autowired@Autowired具有强契约特征,其所标注的属性或参数必须是可装配的。
如果没有Bean可以装配到@Autowired所标注的属性或参数中,⾃动装配就会失败,抛出NoSuchBeanDefinitionException.@Autowired可以对类成员变量、⽅法及构造函数进⾏标注,让 spring 完成 bean ⾃动装配的⼯作。
@Autowired 默认是按照类去匹配,配合 @Qualifier 指定按照名称去装配 bean。
♣ @Resource@Resource是JDK提供的注解,有两个重要属性,分别是name和type。
@Resource依赖注⼊时查找bean的规则既不指定name属性,也不指定type属性,则⾃动按byName⽅式进⾏查找。
spring中InitializingBean和@Bean的初始化,bean初始化
spring中InitializingBean和@Bean的初始化,bean初始化InitializingBean接⼝听过bean的初始化防范,只包括afterPropertiesSet⽅法,凡是继承接⼝的类,在初始化bean的时候都会执⾏该⽅法。
import org.springframework.beans.factory.InitializingBean;public class TestInitializingBean implements InitializingBean{@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("ceshi InitializingBean");}public void testInit(){System.out.println("ceshi init-method");}}bean的InitMethod和DestroyMethod1:在配置类中 @Bean(initMethod = "init",destroyMethod = "destory")注解指定2:实现InitializingBean重写其afterPropertiesSet⽅法,重写DisposableBean重写destroy⽅法3:利⽤java的JSR250规范中的@PostConstruct标注在init⽅法上,@PreDestroy标注在destroy注解上需要注意:单实例bean,容器启动时创建对象多实例bean,没次获取时创建对象初始化:对象创建完成,复制完成,调⽤初始化⽅法销毁:单实例,容器关闭时调⽤,多实例,容器不会销毁,只能⼿动调⽤销毁⽅法类:public class Car {public Car() {System.out.println("Car's Constructor..");}public void init(){System.out.println("Car's Init...");}public void destory(){System.out.println("Car's Destroy...");}}配置类:@Bean(initMethod = "init",destroyMethod = "destory")public Car car(){return new Car();}总结:1、Spring为bean提供了两种初始化bean的⽅式,实现InitializingBean接⼝,实现afterPropertiesSet⽅法,或者在配置⽂件中通过init-method指定,两种⽅式可以同时使⽤。
@Bean注解全解析
@Bean注解全解析随着 SpringBoot 的流⾏,基于注解式开发的热潮逐渐覆盖了基于 XML 纯配置的开发,⽽作为 Spring 中最核⼼的 bean 当然也能够使⽤注解的⽅式进⾏表⽰。
所以本篇就来详细的讨论⼀下作为 Spring 中的 Bean 到底都有哪些⽤法。
@Bean 基础声明Spring 的 @Bean 注解⽤于告诉⽅法,产⽣⼀个 Bean 对象,然后这个 Bean 对象交给 Spring 管理。
产⽣这个 Bean 对象的⽅法 Spring 只会调⽤⼀次,随后这个 Spring 将会将这个 Bean 对象放在⾃⼰的 IOC 容器中。
SpringIOC 容器管理⼀个或者多个 bean,这些 bean 都需要在 @Configuration 注解下进⾏创建,在⼀个⽅法上使⽤ @Bean 注解就表明这个⽅法需要交给 Spring 进⾏管理。
快速搭建⼀个 maven 项⽬并配置好所需要的 Spring 依赖<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>4.3.13.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>4.3.13.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>4.3.13.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>4.3.13.RELEASE</version></dependency>在 src 根⽬录下创建⼀个AppConfig的配置类,这个配置类也就是管理⼀个或多个 bean 的配置类,并在其内部声明⼀个 myBean 的 bean,并创建其对应的实体类@Configurationpublic class AppConfig {// 使⽤@Bean 注解表明myBean需要交给Spring进⾏管理// 未指定bean 的名称,默认采⽤的是 "⽅法名" + "⾸字母⼩写"的配置⽅式@Beanpublic MyBean myBean(){return new MyBean();}}public class MyBean {public MyBean(){System.out.println("MyBean Initializing");}}在对应的 test ⽂件夹下创建⼀个测试类SpringBeanApplicationTests,测试上述代码的正确性public class SpringBeanApplicationTests {public static void main(String[] args) {ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);context.getBean("myBean");}}输出 : MyBean Initializing随着 SpringBoot 的流⾏,我们现在更多采⽤基于注解式的配置从⽽替换掉了基于 XML 的配置,所以本篇⽂章我们主要探讨基于注解的 @Bean 以及和其他注解的使⽤。
Spring的Bean配置说明
<beans> Spring配置文件的根元素,包含一个或多个bean元素。
<bean> 用于告诉Spring容器一个类以及它是如何配置的。
class属性:Java Bean 类名(全路经)。
id属性:Java Bean在BeanFactory中的唯一标识,代码中通过BeanFactory获取JavaBean实例时需以此作为索引名称。
name属性:同上,如果给bean增加别名,可以通过name属性指定一个或多个id。
singleton属性:指定此Java Bean是否采用单例(Singleton)模式,如果设为“true”,则在BeanFactory作用范围内,只维护此Java Bean的一个实例,代码通过BeanFactory获得此Java Bean实例的引用。
反之,如果设为“false”,则通过BeanFactory获取此Java Bean实例时,BeanFactory每次都将创建一个新的实例返回。
abstract属性:设定ApplicationContext是否对bean进行预先的初始化。
parent属性:定义一个模板。
autowire属性:bean自动装配模式。
可选5种模式。
no:不使用自动装配。
Bean的引用必须通过ref元素定义。
byName:通过属性名字进行自动装配。
byType:如果BeanFactory中正好有一个同属性类型一样的bean,就自动装配这个属性。
如果有多于一个这样的bean,就抛出一个致命异常,它指出你可能不能对那个bean使用byType的自动装配。
如果没有匹配的bean,则什么都不会发生,属性不会被设置。
如果这是你不想要的情况(什么都不发生),通过设置dependency-check="objects"属性值来指定在这种情况下应该抛出错误。
constructor:这个同byType类似,不过是应用于构造函数的参数。
如果在BeanFactory中不是恰好有一个bean与构造函数参数相同类型,则一个致命的错误会产生。
beans.xml 用法
beans.xml 用法beans.xml 是Spring 框架中用于配置Beans 的XML 文件。
这个文件是Spring 容器启动时读取的主要配置文件,它包含了定义在Spring 容器中的Bean 对象的配置信息。
以下是 beans.xml 的基本用法:1.定义Bean: 在 beans.xml 中,你可以使用 <bean> 元素来定义一个Bean。
例如:这里,id 属性是Bean 的唯一标识符,class 属性指定了Bean 的完整类名。
2. 配置属性: 你可以在 <bean> 元素内部使用 <property> 元素来配置Bean 的属性。
例如:这里,name 属性指定属性的名称,value 属性指定属性的值。
3. 依赖注入: Spring 支持自动装配(autowiring),允许一个Bean 注入另一个Bean。
你可以使用 autowire 属性来指定注入方式。
例如:在上面的例子中,exampleBean2 自动装配了 exampleBean1。
4. 配置多个Bean: 你可以在同一个 <beans> 元素中配置多个Bean。
例如:1.作用域: 使用 <bean> 元素的 scope 属性,你可以指定Bean 的作用域(如"singleton"、"prototype"、"request"、"session"、"application" 等)。
例如:1.事件监听: 使用 <listener> 元素,你可以配置事件监听器。
例如:1.条件注解: 使用 <condition> 和 <when> 元素,你可以根据特定条件配置或排除Beans。
例如:1.自定义标签: 你还可以使用自定义标签来扩展 beans.xml 的功能。
注入bean的方式和种类
注入bean的方式和种类在Spring框架中,你可以使用多种方式来注入(注入)Bean,以便在应用程序中使用它们。
以下是一些常见的注入方式和种类:1.构造函数注入:通过构造函数将依赖项(Bean)注入到目标Bean中。
这是一种常用的注入方式,通常用于注入必需的依赖项。
你可以使用`<constructor-arg>`元素进行XML配置,或者使用`@Autowired`或`@Inject`注解进行注解配置。
2.Setter方法注入:通过Setter方法将依赖项注入到目标Bean中。
这种方式灵活,通常用于注入可选的依赖项。
你可以使用`<property>`元素进行XML配置,或者使用`@Autowired`或`@Inject`注解进行注解配置。
3.接口注入:通过接口实现将依赖项注入到目标Bean中。
这是一种高度抽象的注入方式,通常用于实现多态和松散耦合。
4.字段注入:通过字段直接注入依赖项,通常使用`@Autowired`或`@Inject`注解进行注解配置。
这种方式相对于构造函数和Setter方法来说更简洁,但也会降低可测试性。
5.工厂方法注入:通过工厂方法将依赖项注入到Bean中,通常使用`@Bean`注解进行配置。
6.自动装配:Spring提供了自动装配功能,可以根据依赖项的类型和名称自动注入Bean。
有三种自动装配模式:根据类型(byType)、根据名称(byName)、自动装配构造函数参数(constructor)。
7.SpEL(Spring表达式语言)注入:使用SpEL表达式来定义Bean之间的关系和依赖。
这使得注入可以更加灵活和动态化。
8.Java配置类注入:通过Java配置类来定义Bean之间的关系,使用`@Configuration`和`@Bean`注解进行配置。
这些注入方式和种类可以根据项目需求和设计选择使用。
通常,构造函数注入和Setter 方法注入是最常见的方式,而自动装配可以简化配置。
Spring中Bean管理的常用注解
Spring中Bean管理的常⽤注解在Spring中,主要⽤于管理bean的注解分为四⼤类:1.⽤于创建对象。
2.⽤于给对象的属性注⼊值。
3.⽤于改变作⽤的范围。
4.⽤于定义⽣命周期。
这⼏个在开发中经常接触到,也可以说每天都会遇见。
其中创建对象是重点,Spring中创建对象的有四个:分别是@Component,@Controller,@Service,@Repository。
对于@Component注解:把资源让Spring来管理,相当于xml中的配置的Bean。
属性:value:指定Bean中的id。
如果不指定value属性,默认Bean的id是当前类的类名,⾸字母⼩写。
在开发中的场景是这样的,其实是在实现类中加⼊即可:@Component("customerService")public class CustomerServiceImpl implements CustomerService{public void save() {System.out.println("顾客保存⽅法");}}⽽其它的三个注解都是针对⼀个衍⽣注解,它们的作⽤及属性都是⼀模⼀样的。
只不过提供了更加明确的语义化。
@Controller:⼀般⽤于表现层的注解。
@Service:⼀般⽤于业务层的注解。
@responsitory:⼀般⽤于持久层的注解。
⽤法与以上相同,这⾥不做过多的解释。
要理解这个三个注解就是让标注类本⾝的⽤途清晰⽽已。
接下来,聊聊⽤于给对象的属性注⼊值得问题。
Spring给我们提出了注⼊数据的注解有:@Value,@Autowired,@Qualifier,@Resource。
其中@Value:注⼊基本数据类型和String类型数据,它的属性value⽤于指定值。
@Autowired这个⽤法是⽐较重要的,它能够⾃动按照类型注⼊。
当使⽤注解注⼊属性时,set⽅法可以省略。
SpringXML方式配置bean的集合注入:list,map,properties
SpringXML⽅式配置bean的集合注⼊:list,map,properties 新建⼀个bean,设置相应的集合属性1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23public class Collections {private Set<String> sets;private List<String> lists;private Map<String,String> maps;public Set<String> getSets() {return sets;}public void setSets(Set<String> sets) {this.sets = sets;}public List<String> getLists() {return lists;}public void setLists(List<String> lists) {this.lists = lists;}public Map<String, String> getMaps() {return maps;}public void setMaps(Map<String, String> maps) { this.maps = maps;}}在配置⽂件中配置:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21<bean id="coll"class=" com.fz.entity.Collections"> <property name="sets"><set><value>set1</value><value>set2</value></set></property><property name="lists"><list><value>list1</value><value>list2</value></list></property><property name="maps"><map><entry key="map1"value="map1"/><entry key="map2"value="map2"/><entry key="map3"value="map3"/></map></property></bean>测试获取bean的值,此时控制台打印:list1 和list21 2 3 4 5 6 7 8@Testpublic void getProperties(){ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml"); Collections coll = (Collections) ctx.getBean("coll");for(String temp : coll.getLists()) {System.out.println(temp);}}。
第2章 Spring中的Bean
创建名为Bean3的Javan类ew;ClassPathXmlApplicationContext(xmlPath); <bean id="mSyyBseteamn3.oFuatc.tporriyn"tlncl(aaspsp=l"iccaotmio.nitChoeinmteax.ti.ngsettaBnecean.f(a"cbteoaryn.3M")y)B; ean3Factory" /> <bean id}="bean创3"建fac一to个ryJ-baveaan工=厂"m类yB,ea在n3类Fa中ct使ory用" f非ac静tor态y-方me法th获od取="Bcreeaant3eB实e例an;" />
✎ 预习检查
– Bean的实例化有哪几种方式? – Bean的作用域是什么? – Bean有几种装配方式?
✎ 学习目标
实例化Bean的三种方式 1
Bean的三种装配方式
掌握
Bean的常用属性及
3
其子元素
Bean的作用域和
生命周期 2
✎ 主讲内容
2.1 Bean的配置
2.2 Bean的实例化 2.3 Bean的作用域 2.4 Bean的生命周期 2.5 Bean的装配方式
System.out.println(applicationContext.getBean("bean2")); 创建一个Java工厂类,在类中使用静态方法获取Bean2实例;
bean的初始化方法
bean的初始化方法Bean的初始化方法Bean是Spring框架中最重要的概念之一,它是一个由Spring容器管理的对象。
在使用Spring框架开发应用程序时,我们经常需要定义和配置Bean。
而Bean的初始化方法则是指在Bean实例化之后,容器为该Bean执行的初始化操作。
下面将详细介绍Bean的初始化方法。
一、定义Bean首先,需要在Spring配置文件中定义一个Bean。
可以使用XML或注解方式进行定义。
1. XML方式在XML配置文件中,使用<bean>元素来定义一个Bean。
例如:<bean id="exampleBean" class="com.example.ExampleClass"> <property name="name" value="John"/><property name="age" value="25"/></bean>```其中,id属性表示该Bean的唯一标识符,在整个应用程序中都可以使用该标识符来获取该Bean实例;class属性表示该Bean对应的Java类;property元素则表示为该类中的属性设置值。
2. 注解方式在Java类上使用注解来标识一个Bean。
例如:```@Componentpublic class ExampleClass {// 属性}```其中,@Component注解表示这是一个组件(即一个Bean),Spring容器会自动扫描并注册这个类为一个Bean。
二、实现InitializingBean接口InitializingBean是Spring框架提供的一个接口,在实现该接口后可以在初始化方法中进行一些操作。
这个接口只有一个方法:afterPropertiesSet()。
Spring中bean的四种注入方式
Spring 中bean 的四种注⼊⽅式⼀、前⾔ 最近在复习的相关内容,这篇博客就来记录⼀下为的属性注⼊值的四种⽅式。
这篇博客主要讲解在⽂件中,如何为的属性注⼊值,最后也会简单提⼀下使⽤注解的⽅式。
废话不多说,直接开始吧。
⼆、正⽂2.1 注⼊⽅式 在中,共有四种⽅式为的属性注⼊值,分别是:set ⽅法注⼊构造器注⼊静态⼯⼚注⼊实例⼯⼚注⼊ 下⾯我就分别演⽰⼀下,如何使⽤这四种⽅式进⾏属性的注⼊。
2.2 set ⽅法注⼊ 在演⽰前,我们需要准备⼏个类,我使⽤下⾯两个类来进⾏注⼊的演⽰,这两个类分别是和类:Spring Spring bean xml bean Spring bean User Car public class Car {// 只包含基本数据类型的属性private int speed;private double price;public Car() {}public Car(int speed, double price) {this.speed = speed;this.price = price;}public int getSpeed() {return speed;}public void setSpeed(int speed) { this.speed = speed;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}@Overridepublic String toString() {return "Car{" +"speed=" + speed + ", price=" + price + '}';}}public class User {private String name;private int age;// 除了上⾯两个基本数据类型的属性,User 还依赖Carprivate Car car;public User() {}public User(String name, int age, Car car) { = name;this.age = age;this.car = car;}public String getName() {return name;}public void setName(String name) { = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public Car getCar() { 有了上⾯两个类,我们就可以演⽰注⼊了。
springMVC详解以及注解说明
springMVC详解以及注解说明基于注释(Annotation)的配置有越来越流行的趋势,Spring 2.5 顺应这种趋势,提供了完全基于注释配置Bean、装配Bean 的功能,您可以使用基于注释的Spring IoC 替换原来基于XML 的配置。
本文通过实例详细讲述了Spring 2.5 基于注释IoC 功能的使用。
概述注释配置相对于XML 配置具有很多的优势:∙ 它可以充分利用Java 的反射机制获取类结构信息,这些信息可以有效减少配置的工作。
如使用JPA 注释配置ORM 映射时,我们就不需要指定PO 的属性名、类型等信息,如果关系表字段和PO 属性名、类型都一致,您甚至无需编写任务属性映射信息——因为这些信息都可以通过Java 反射机制获取。
∙ 注释和Java 代码位于一个文件中,而XML 配置采用独立的配置文件,大多数配置信息在程序开发完成后都不会调整,如果配置信息和Java 代码放在一起,有助于增强程序的内聚性。
而采用独立的XML 配置文件,程序员在编写一个功能时,往往需要在程序文件和配置文件中不停切换,这种思维上的不连贯会降低开发效率。
因此在很多情况下,注释配置比XML 配置更受欢迎,注释配置有进一步流行的趋势。
Spring 2.5 的一大增强就是引入了很多注释类,现在您已经可以使用注释配置完成大部分XML 配置的功能。
在这篇文章里,我们将向您讲述使用注释进行Bean 定义和依赖注入的内容。
Spring2.5的注释Spring 2.5 提供了AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor、PersistenceAnnotationBeanPostProcessor 和RequiredAnnotationBeanPostProcessor这四个主要的关于Annotation 的BeanPostProcessor。
spring注入bean的几种策略模式
spring注⼊bean的⼏种策略模式上篇⽂章我们提到在有多个实现类的情况下,spring是如何选择特定的bean将其注⼊到代码⽚段中,我们讨论了按照名称注⼊和使⽤@Qualifier 注解输⼊的两种⽅式,本篇⽂章将结合之前提到的和spring的其他注⼊⽅式⼀起进⾏讨论。
本⽂主题我们将讨论在⼀个接⼝或者抽象类在具有多个实现类的情况下,有多少种策略能够让我们在特定的代码⽚段中注⼊想要的bean。
按照名称定义⼀个Skill借⼝,他描述了英雄具备哪些技能,现在有两个英雄的实现类Diana和Irelia,通过component注解将其标注为bean,在容器启动的时候会将他们加载到容器中。
现在有⼀个BannerController要使⽤Diana这个bean@RestControllerpublic class BannerController {@Autowiredprivate Skill diana;@RequestMapping(value = "/v2/banner", method = {RequestMethod.GET})public String test() {diana.r();return "Hello SpringBoot";}}private Skill diana;这⾥将成员变量的名字写成Diana这个bean的名字,容器就会选择Diana这个注⼊,这就叫做按照名称注⼊。
spring会给每个bean设置默认到的名字也可以⾃定义,⼤家⾃⾏查找资料了解即可。
@Qualifier 注解还是上⽂的例⼦,如果成员变量名不写成bean的名称,是其他的名字,⽐如按照常规的写法会写成private Skill skill;这个时候就可以使⽤@Qualifier 注解,@RestControllerpublic class BannerController {@Autowired@Qualifier("diana")private Skill skill;@RequestMapping(value = "/v2/banner", method = {RequestMethod.GET})public String test() {skill.r();return "Hello SpringBoot";}有选择的注⼊⼀个bean,注释掉某个bean上的@Component如果我们确定要使⽤哪个bean,那可以把其他的注释掉//@Componentpublic class Irelia implements Skill {public Irelia() {System.out.println("Hello, Irelia");}public void q(){System.out.println("Irelia Q");}public void w(){System.out.println("Irelia W");}public void e(){System.out.println("Irelia E");}public void r(){System.out.println("Irelia R");}}让Skill的实现类只有⼀个,⾃然就不要再操⼼注⼊哪个了,就只会注⼊存在于容器当中的惟⼀的那⼀个了。
Spring@Configuration注解及配置方法
Spring@Configuration注解及配置⽅法Spring @Configuration注解Spring3.0开始,@Configuration⽤于定义配置类,定义的配置类可以替换xml⽂件,⼀般和@Bean注解联合使⽤。
@Configuration注解主要标注在某个类上,相当于xml配置⽂件中的<beans>@Bean注解主要标注在某个⽅法上,相当于xml配置⽂件中的<bean>等价于注意:@Configuration注解的配置类有如下要求:@Configuration不可以是final类型;@Configuration不可以是匿名类;嵌套的configuration必须是静态类。
Configuration⾥⾯有⼀个component组件来标识,说明此类也是⼀个bean,可以被调⽤,来看看哪些主要的注解含有component:Annotation 的装配 Spring 中,尽管使⽤ XML 配置⽂件可以实现 Bean 的装配⼯作,但如果应⽤中有很多 Bean 时,会导致 XML 配置⽂件过于靡肿,给后续的维护和升级⼯作带来⼀定的困难为此, Spring 提供了对 Annotation (注解)技术的全⾯⽀持 Spring 中定义了⼀系列的注解,常⽤的注解如下所⽰• @Component: 可以使⽤此注解描述 Spring 中的 Bean ,但它是⼀个泛化的概念,仅仅表⽰⼀个组件 (Bean ,并且可以作⽤在任何层次使⽤时只需将该注解标注在相应类上即可• @Repository: ⽤于将数据访问层( DAO 层)的类标识为 Spring 中的 Bean ,其功能与 @Component 相同• @Service: 通常作⽤在业务层( Service ,⽤于将业务层的类标识为 Spring 中的 Bean 其功能与@Component 相同• @Controller: 通常作⽤在控制层(如 Spring MVC Controller ,⽤于将控制层的类标识 Spring 中的 Bean ,其功能与@Component 相同• @Autowired: ⽤于对 Bean 的属性变量、属性的 setter ⽅法及构造⽅法进⾏标注,配合对应的注解处理器完成 Bean 的⾃动配置⼯作默认按照 Bean 的类型进⾏装配• @Resource: 其作⽤与 Autowired ⼀样其区别在于@Autowired 默认按照 Bean 类型装配,⽽@Resource 默认按照 Bean 实例名称进⾏装配 @Resource 中有两个重要属性: name type Spring name 属性解析为 Bean 实例名称, type 属性解析为 Bean 实例类型如果指定 name 属性,贝IJ 按实例名称进⾏装配;如果指定 type 属性,则按 Bean 类型进⾏装配;如果都不指定,则先按 Bean 实例名称装配,如果不能匹配,再按照 Bean 类型进⾏装⾃⼰;如果都⽆法匹配,则抛出NoSuchBeanDefinitionException 异常• @Qualifier: @Autowired 注解配合使⽤,会将默认的按 Bean 类型装配修改为接 Bean 的实例名称装配, Bean 的实例名称由 @Qualifier 注解的参数指定在上⾯⼏个注解中,虽然@Repository @Service @Controller 功能与@Component 注解的功能相同,但为了使标注类本⾝⽤途更加清晰,建议在实际开发中使⽤@Repository @Service @Controller 分别对实现类进⾏标注下⾯。
获取bean 的方法
获取bean 的方法全文共四篇示例,供读者参考第一篇示例:在Spring框架中,Bean是一个由Spring IoC容器管理的Java对象。
要获取Bean对象,首先需要配置Spring容器并将Bean对象交给Spring容器管理。
然后通过容器提供的方法来获取Bean对象。
一、配置Spring容器1.创建Spring配置文件:Spring的配置文件通常以xml格式存在,用于配置Bean对象及其依赖关系。
配置文件可以包含Bean定义、依赖注入、切面配置等信息。
2.配置Bean对象:在配置文件中定义Bean对象,通常通过<bean>标签实现。
可以配置Bean的名称、作用域、类路径等信息。
3.配置依赖注入:Spring支持通过构造函数注入、Setter方法注入、接口注入等方式进行依赖注入。
在配置文件中,可以通过<constructor-arg>和<property>标签来配置Bean的依赖关系。
4.加载配置文件:在应用程序启动时,需要加载Spring配置文件,将配置信息加载到Spring容器中。
通常可以通过ClassPathXmlApplicationContext、FileSystemXmlApplicationContext等类来加载配置文件。
二、获取Bean对象1.通过Bean的名称获取:Spring容器会为每个Bean对象分配一个唯一的名称,可以通过该名称获取Bean对象。
可以使用getBean()方法来根据Bean的名称获取Bean对象。
```ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");BeanClass bean = (BeanClass)context.getBean("beanName");``````BeanClass bean = context.getBean(BeanClass.class);```3.通过指定标签获取:在配置文件中,可以为Bean对象指定标签或注解。
spring中向一个单例bean中注入非单例bean的方法详解
spring中向⼀个单例bean中注⼊⾮单例bean的⽅法详解⽬录前⾔错误实例演⽰实现ApplicationContextAware接⼝lookup methodlookup method签名总结前⾔看到这个题⽬相信很多⼩伙伴都是懵懵的,平时我们的做法⼤都是下⾯的操作@Componentpublic class People{@Autowiredprivate Man man;}这⾥如果Man是单例的,这种写法是没有问题的,但如果Man是原型的,这样是否会存在问题。
错误实例演⽰这⾥有⼀个原型(⽣命周期为prototype)的类package ponent;import org.springframework.context.annotation.Scope;import ponent;@Component@Scope(value = "prototype")public class Man {public void eat() {System.out.println("I like beef");}}有⼀个单例(⽣命周期为singleton)的类package ponent;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Lookup;import ponent;@Componentpublic class Woman {//使⽤依赖注⼊的⽅式,注⼊原型的Man @Autowiredprivate Man man;public void eat() {System.out.println("man:"+man);System.out.println("I like fruits");}}下⾯看测试⽅法,package com.example.myDemo;import ponent.MyFactoryBean;import ponent.Woman;import com.example.myDemo.po.Student;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;import org.springframework.context.ApplicationContext;@SpringBootApplication(exclude={DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class})public class MyDemoApplication {public static void main(String[] args) {ApplicationContext ac=SpringApplication.run(MyDemoApplication.class, args);Woman woman=(Woman)ac.getBean("woman");for(int i=0;i<5;i++){woman.eat();}}}看下测试结果,上⾯的结果显⽰Woman中的man是单例的,因为5次循环打印打出的结果是同⼀个对象,发⽣了什么,Woman是单例的,Man是原型的,我们使⽤常规的@Autowired注解注⼊的却是同⼀个实例,这⾥想下为什么Man是⼀个对象,Woman是单例的,意味着在整个spring容器中只有⼀个实例,在属性注⼊的时候肯定也只会注⼊⼀次,所以其中Man属性也只能是⼀个实例,出现上图的结果也就不稀奇了。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
<beans>
Spring配置文件的根元素,包含一个或多个bean元素。
default-autowire属性:默认的bean自动装配模式。
可选5种模式。
no:不使用自动装配。
Bean的引用必须通过ref元素定义。
byName:通过属性名字进行自动装配。
byType:如果BeanFactory中正好有一个同属性类型一样的bean,就自动装配这个属性。
如果有多于一个这样的bean,就抛出一个致命异常,它指出你可能不能对那个bean使用byType 的自动装配。
如果没有匹配的bean,则什么都不会发生,属性不会被设置。
如果这是你不想要的情况(什么都不发生),通过设置dependency-check="objects"属性值来指定在这种情况下应该抛出错误。
constructor:这个同byType类似,不过是应用于构造函数的参数。
如果在BeanFactory中不是恰好有一个bean与构造函数参数相同类型,则一个致命的错误会产生。
autodetect:通过对bean 检查类的内部来选择constructor或byType。
如果找到一个缺省的构造函数,那么就会应用byType。
default-dependency-check属性:默认的依赖检查模式。
可选四种。
none :不进行依赖检查。
没有指定值的bean属性仅仅是没有设值。
Simple:对基本类型和集合(除了合作者外,比如其他的bean,所有东西)进行依赖检查。
Object:对合作者进行依赖检查。
all :对合作者,基本类型和集合都进行依赖检查。
default-lazy-init属性:默认延迟加载。
True 或False 。
<bean>
用于告诉Spring容器一个类以及它是如何配置的。
class属性:Java Bean 类名。
id属性:Java Bean在BeanFactory中的唯一标识,代码中通过BeanFactory获取JavaBean 实例时需以此作为索引名称。
name属性:同上,如果给bean增加别名,可以通过name属性指定一个或多个id。
singleton属性:指定此Java Bean是否采用单例(Singleton)模式,如果设为“true”,则在BeanFactory作用范围内,只维护此Java Bean的一个实例,代码通过BeanFactory获得此Java Bean实例的引用。
反之,如果设为“false”,则通过BeanFactory获取此Java Bean实例时,BeanFactory每次都将创建一个新的实例返回。
abstract属性:设定ApplicationContext是否对bean进行预先的初始化。
parent属性:定义一个模板。
autowire属性:bean自动装配模式。
可选5种模式。
no:不使用自动装配。
Bean的引用必须通过ref元素定义。
byName:通过属性名字进行自动装配。
byType:如果BeanFactory中正好有一个同属性类型一样的bean,就自动装配这个属性。
如果有多于一个这样的bean,就抛出一个致命异常,它指出你可能不能对那个bean使用byType 的自动装配。
如果没有匹配的bean,则什么都不会发生,属性不会被设置。
如果这是你不
想要的情况(什么都不发生),通过设置dependency-check="objects"属性值来指定在这种情
况下应该抛出错误。
constructor:这个同byType类似,不过是应用于构造函数的参数。
如果在BeanFactory中不
是恰好有一个bean与构造函数参数相同类型,则一个致命的错误会产生。
autodetect:通过对bean 检查类的内部来选择constructor或byType。
如果找到一个缺省的
构造函数,那么就会应用byType。
dependency-check属性:依赖检查模式。
可选四种。
none :不进行依赖检查。
没有指定值的bean属性仅仅是没有设值。
Simple:对基本类型和集合(除了合作者外,比如其他的bean,所有东西)进行依赖检查。
Object:对合作者进行依赖检查。
all :对合作者,基本类型和集合都进行依赖检查。
lazy-init属性:延迟加载。
True 或False 。
init-method属性:初始化方法,此方法将在BeanFactory创建JavaBean实例之后,在向应
用层返回引用之前执行。
一般用于一些资源的初始化工作。
destroy-method属性:销毁方法。
此方法将在BeanFactory销毁的时候执行,一般用于资源
释放。
factory-bean属性:通过实例工厂方法创建bean,class属性必须为空,factory-bean属性必
须指定一个bean的名字,这个bean一定要在当前的bean工厂或者父bean工厂中,并包含
工厂方法。
而工厂方法本身通过factory-method属性设置。
factory-method属性:设定工厂类的工厂方法。
depends-on属性:Bean依赖关系。
一般情况下无需设定。
Spring会根据情况组织各个依赖
关系的构建工作。
只有某些特殊情况下,如JavaBean中的某些静态变量需要进行初始化(这
是一种BadSmell,应该在设计上应该避免)。
通过depends-on指定其依赖关系可保证在此Bean加载之前,首先对depends-on所指定的资源进行加载。
----------------------------------------------------------------------------------------------
Spring Bean 配置说明
<property>
用于设置一个属性。
name属性:属性的名称。
value属性:指定bean的属性值。
BeanFactory将自动根据Java Bean对应的属性类型加以匹配。
如果需要将属性值设定为null,必须使用<null/>节点。
ref属性:指定了属性对BeanFactory中其他Bean的引用关系。
<value>
指定bean的属性值。
<ref>
指定了属性对BeanFactory中其他Bean的引用关系。
bean属性:指定了属性对BeanFactory中其他Bean的引用关系。
local属性:指定了属性对BeanFactory中其他Bean的引用关系。
(仅在本地(同一个)xml文件里寻找bean。
parent属性:指定了属性对BeanFactory中其他Bean模板的引用关系。
<list>
指定bean的属性类型为List的属性值。
<map>
指定bean的属性类型为List的属性值。
<set>
指定bean的属性类型为List的属性值。
<props>
指定bean的属性类型为Properties的属性值。
<prop>
key属性:指定Properties的键
<idref>
用来设置属性值为容器中其他bean的id或name。
<null>
指定一个空值。
<constructor-arg>
使用构造方法注入,指定构造方法的参数。
index属性:设置参数的序号。
ref属性:同ref
type属性:参数类型。
value属性:参数的值。
<lookup-method>
lookup方法注入
bean属性:要注入的bean名
name属性:要注入的方法名称
<replaced-method>
用来把已存在的方法实现替换为其他的实现。
name属性:要替换的方法名
replacer属性:替换者类,实现org.springframework.beans.factory.support.MethodReplacer
接口)
<arg-type>
方法返回的类型。