Spring 配置使用介绍

news/2024/10/19 3:33:19/

Spring 配置使用介绍

文章目录

  • Spring 配置使用介绍
    • 一、集合类型注入
      • 1、注解形式
      • 2、xml 形式
    • 二、alias 使用
      • 1、xml 形式
      • 2、注解形式
    • 三、depends-on
      • 1、xml 形式
      • 2、注解形式
    • 四、继承关系
    • 五、scope
      • 1、xml 形式
      • 2、注解形式
    • 六、replaced-method
    • 七、配置文件嵌套
    • 八、懒加载 lazy-init
      • 1、xml 形式
      • 2、注解形式
    • 九、其他
      • 1、使用 DefaultListableBeanFactory
      • 2、混合使用

一、集合类型注入

1、注解形式

package com.apress.prospring5.ch3.annotated;import com.apress.prospring5.ch3.ContentHolder;
import org.springframework.stereotype.Service;/*** Created by iuliana.cosmina on 2/19/17.*/
@Service("lyricHolder")
public class LyricHolder implements ContentHolder{private String value = "'You be the DJ, I'll be the driver'";@Override public String toString() {return "LyricHolder: { " + value + "}";}
}
package com.luo.spring.guides.iocdi.collections.annotation;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.support.GenericXmlApplicationContext;
import org.springframework.stereotype.Service;import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;@Service("injectCollection")
public class CollectionInjection {/***      @Resource(name="map") is equivalent with @Autowired @Qualifier("map")*/@Autowired@Qualifier("map")private Map<String, Object> map;@Resource(name="props")private Properties props;@Resource(name="set")private Set set;@Resource(name="list")private List list;public void displayInfo() {System.out.println("Map contents:\n");map.entrySet().stream().forEach(e -> System.out.println("Key: " + e.getKey() + " - Value: " + e.getValue()));System.out.println("\nProperties contents:\n");props.entrySet().stream().forEach(e -> System.out.println("Key: " + e.getKey() + " - Value: " + e.getValue()));System.out.println("\nSet contents:\n");set.forEach(obj -> System.out.println("Value: " + obj));System.out.println("\nList contents:\n");list.forEach(obj -> System.out.println("Value: " + obj));}}
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:util="http://www.springframework.org/schema/util"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/utilhttp://www.springframework.org/schema/util/spring-util.xsd"><context:component-scan base-package="com.apress.prospring5.ch3.annotated"/><util:map id="map" map-class="java.util.HashMap"><entry key="someValue" value="It's a Friday, we finally made it"/><entry key="someBean" value-ref="lyricHolder"/></util:map><util:properties id="props"><prop key="firstName">John</prop><prop key="secondName">Mayer</prop></util:properties><util:set id="set" set-class="java.util.HashSet"><value>I can't believe I get to see your face</value><ref bean="lyricHolder"/></util:set>	<util:list id="list" list-class="java.util.ArrayList"><value>You've been working and I've been waiting</value><ref bean="lyricHolder"/></util:list>
</beans>

测试

package com.luo.spring.guides.iocdi.collections.annotation;import com.luo.spring.guides.iocdi.annotation.setter.SetterInjectionConfiguration;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;/*** @author : archer* @date : Created in 2022/11/30 17:41* @description :*/
public class Main {public static void main(String... args) {GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();ctx.load("classpath:iocdi/injection/collections/app-context-annotation.xml");ctx.refresh();CollectionInjection instance = (CollectionInjection) ctx.getBean("injectCollection");instance.displayInfo();ctx.close();}
}

输出

Map contents:

Key: map - Value: {someBean=LyricHolder: { ‘You be the DJ, I’ll be the driver’}, someValue=It’s a Friday, we finally made it}

Properties contents:

Key: firstName - Value: John
Key: secondName - Value: Mayer

Set contents:

Value: LyricHolder: { ‘You be the DJ, I’ll be the driver’}
Value: I can’t believe I get to see your face

List contents:

Value: You’ve been working and I’ve been waiting
Value: LyricHolder: { ‘You be the DJ, I’ll be the driver’}

2、xml 形式

package com.luo.spring.guides.iocdi.collections;public interface ContentHolder {}
package com.luo.spring.guides.iocdi.collections;/*** Created by iuliana.cosmina on 2/19/17.*/
public class LyricHolder implements ContentHolder{private String value = "'You be the DJ, I'll be the driver'";@Override public String toString() {return "LyricHolder: { " + value + "}";}
}
package com.luo.spring.guides.iocdi.collections;import org.springframework.context.support.GenericXmlApplicationContext;import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;public class CollectionInjection {private Map<String, Object> map;private Properties props;private Set set;private List list;public void displayInfo() {System.out.println("Map contents:\n");map.entrySet().stream().forEach(e -> System.out.println("Key: " + e.getKey() + " - Value: " + e.getValue()));System.out.println("\nProperties contents:\n");props.entrySet().stream().forEach(e -> System.out.println("Key: " + e.getKey() + " - Value: " + e.getValue()));System.out.println("\nSet contents:\n");set.forEach(obj -> System.out.println("Value: " + obj));System.out.println("\nList contents:\n");list.forEach(obj -> System.out.println("Value: " + obj));}public void setList(List list) {this.list = list;}public void setSet(Set set) {this.set = set;}public void setMap(Map<String, Object> map) {this.map = map;}public void setProps(Properties props) {this.props = props;}
}
<?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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="lyricHolder" class="com.luo.spring.guides.iocdi.collections.LyricHolder"/><bean id="injectCollection" class="com.luo.spring.guides.iocdi.collections.CollectionInjection"><property name="map"><map><entry key="someValue" value="It's a Friday, we finally made it"/><entry key="someBean" value-ref="lyricHolder"/></map></property><property name="props"><props><prop key="firstName">John</prop><prop key="secondName">Mayer</prop></props></property><property name="set"><set><value>I can't believe I get to see your face</value><ref bean="lyricHolder"/></set></property><property name="list"><list><value>You've been working and I've been waiting</value><ref bean="lyricHolder"/></list></property></bean>
</beans>

测试

package com.luo.spring.guides.iocdi.collections;import org.springframework.context.support.GenericXmlApplicationContext;/*** @author : archer* @date : Created in 2022/11/30 17:27* @description :*/
public class Main {public static void main(String... args) {GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();ctx.load("classpath:iocdi/injection/collections/app-context-xml.xml");ctx.refresh();CollectionInjection instance = (CollectionInjection) ctx.getBean("injectCollection");instance.displayInfo();ctx.close();}
}

输出

Map contents:

Key: someValue - Value: It’s a Friday, we finally made it
Key: someBean - Value: LyricHolder: { ‘You be the DJ, I’ll be the driver’}

Properties contents:

Key: firstName - Value: John
Key: secondName - Value: Mayer

Set contents:

Value: I can’t believe I get to see your face
Value: LyricHolder: { ‘You be the DJ, I’ll be the driver’}

List contents:

Value: You’ve been working and I’ve been waiting
Value: LyricHolder: { ‘You be the DJ, I’ll be the driver’}

二、alias 使用

1、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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="john" name="jon johnny,jonathan;jim" class="java.lang.String"/><alias name="john" alias="ion"/><bean name="jon1 johnny1,jonathan1;jim1" class="java.lang.String"/><bean id="jon1 johnny1,jonathan1;jim1" class="java.lang.String"/>
</beans>

测试

package com.luo.spring.guides.iocdi.alias;import org.springframework.context.support.GenericXmlApplicationContext;import java.util.Arrays;
import java.util.Map;/*** @author : archer* @date : Created in 2022/11/30 19:09* @description :*/
public class Main {public static void main(String... args) {GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();ctx.load("classpath:iocdi/injection/alias/app-context-alias.xml");ctx.refresh();String s1 = (String) ctx.getBean("john");String s2 = (String) ctx.getBean("jon");String s3 = (String) ctx.getBean("johnny");String s4 = (String) ctx.getBean("jonathan");String s5 = (String) ctx.getBean("jim");String s6 = (String) ctx.getBean("ion");System.out.println((s1 == s2));System.out.println((s2 == s3));System.out.println((s3 == s4));System.out.println((s4 == s5));System.out.println((s5 == s6));Map<String,String> beans = ctx.getBeansOfType(String.class);if(beans.size() == 3) {System.out.println("There is only 3 String bean.");}beans.entrySet().stream().forEach(b ->System.out.println("id: " + b.getKey() + "\n aliases: "+ Arrays.toString(ctx.getAliases(b.getKey())) + "\n"));ctx.close();}
}

输出

true
true
true
true
true

id: john
aliases: [jon, ion, jonathan, jim, johnny]

id: jon1
aliases: [jonathan1, johnny1, jim1]

id: jon1 johnny1,jonathan1;jim1
aliases: []

2、注解形式

package com.luo.spring.guides.iocdi.alias.annotation;import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;/*** Created by iuliana.cosmina on 2/19/17.** Observation: @Component("singer") is equivalent to @Component in this case* Decomment and comment annotations below and test the result.*/
@Component("johnMayer")
public class Singer {private String lyric = "We found a message in a bottle we were drinking";public void setLyric(@Value("I'm busted up but I'm loving every minute of it")String lyric) {this.lyric = lyric;}public void sing() {System.out.println(lyric);}}
package com.luo.spring.guides.iocdi.alias.annotation;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** @author : archer* @date : Created in 2022/11/30 19:19* @description :*/
public class AliasConfig {@Configurationstatic class AliasBeanConfig {@Bean(name = {"johnMayer", "john", "jonathan", "johnny"})public Singer singer() {return new Singer();}}
}

测试

package com.luo.spring.guides.iocdi.alias.annotation;import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.GenericApplicationContext;import java.util.Arrays;
import java.util.Map;/*** @author : archer* @date : Created in 2022/11/30 19:19* @description :*/
public class Main {public static void main(String... args) {GenericApplicationContext ctx = new AnnotationConfigApplicationContext(AliasConfig.AliasBeanConfig.class);Map<String, Singer> beans = ctx.getBeansOfType(Singer.class);beans.entrySet().stream().forEach(b ->System.out.println("id: " + b.getKey() + "\n aliases: "+ Arrays.toString(ctx.getAliases(b.getKey())) + "\n"));ctx.close();}
}

输出

id: johnMayer
aliases: [jonathan, johnny, john]

三、depends-on

package com.luo.spring.guides.iocdi.dependson.domain;import org.springframework.stereotype.Component;/*** Created by iuliana.cosmina on 2/22/17.*/
@Component("gopher")
public class Guitar {public void sing(){System.out.println("Cm Eb Fm Ab Bb");}
}
package com.luo.spring.guides.iocdi.dependson.domain;import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.context.annotation.DependsOn;
import org.springframework.stereotype.Component;/*** Created by iuliana.cosmina on 2/22/17.*/
@Component("johnMayer")
@DependsOn("gopher")
public class Singer implements ApplicationContextAware{ApplicationContext applicationContext;@Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext = applicationContext;}private Guitar guitar;public Singer(){}public void sing() {guitar =  applicationContext.getBean("gopher",Guitar.class);guitar.sing();}
}

1、xml 形式

  • 表明实例 gopher 必须在实例 johnMayer 之前初始化,用于控制 Spring 实例化 bean 的顺序。
<?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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><!-- Following the principle of DRY (Don't Repeat Yourself) the same classes can be used for the XMLand Annotated example. If component scanning is not enabled, the annotations are ignored. --><bean id="johnMayer" class="com.luo.spring.guides.iocdi.dependson.domain.Singer" depends-on="gopher"/><bean id="gopher" class="com.luo.spring.guides.iocdi.dependson.domain.Guitar"/>
</beans>

测试

package com.luo.spring.guides.iocdi.dependson.xml;import com.luo.spring.guides.iocdi.dependson.domain.Singer;
import org.springframework.context.support.GenericXmlApplicationContext;/*** @author : archer* @date : Created in 2022/11/30 19:29* @description :*/
public class Main {public static void main(String... args) {GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();ctx.load("iocdi/injection/dependson/app-context-xml.xml");ctx.refresh();Singer johnMayer = ctx.getBean("johnMayer", Singer.class);johnMayer.sing();ctx.close();}
}

输出

Cm Eb Fm Ab Bb

2、注解形式

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><context:component-scanbase-package="com.luo.spring.guides.iocdi.dependson"/>
</beans>

测试

package com.luo.spring.guides.iocdi.dependson.annotation;import com.luo.spring.guides.iocdi.dependson.domain.Singer;
import org.springframework.context.support.GenericXmlApplicationContext;/*** @author : archer* @date : Created in 2022/11/30 19:29* @description :*/
public class Main {public static void main(String... args) {GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();ctx.load("classpath:iocdi/injection/dependson/app-context-annotation.xml");ctx.refresh();Singer johnMayer = ctx.getBean("johnMayer", Singer.class);johnMayer.sing();ctx.close();}}

输出

Cm Eb Fm Ab Bb

四、继承关系

package com.luo.spring.guides.iocdi.inheritance;/*** Created by iuliana.cosmina on 2/25/17.*/
public class Singer {private String name;private int age;public void setName(String name) {this.name = name;}public void setAge(int age) {this.age = age;}public String toString() {return "\tName: " + name + "\n\t" + "Age: " + age;}
}
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="parent" class="com.luo.spring.guides.iocdi.inheritance.Singer"p:name="John Mayer" p:age="39" /><bean id="child" class="com.luo.spring.guides.iocdi.inheritance.Singer"parent="parent" p:age="0"/>
</beans>

测试

package com.luo.spring.guides.iocdi.inheritance;import org.springframework.context.support.GenericXmlApplicationContext;/*** @author : archer* @date : Created in 2022/11/30 20:13* @description :*/
public class Main {public static void main(String... args) {GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();ctx.load("classpath:iocdi/injection/inheritance/app-context-xml.xml");ctx.refresh();Singer parent = (Singer) ctx.getBean("parent");Singer child = (Singer) ctx.getBean("child");System.out.println("Parent:\n" + parent);System.out.println("Child:\n" + child);System.out.println(parent == child);}}

输出

Parent:
Name: John Mayer
Age: 39
Child:
Name: John Mayer
Age: 0

false

五、scope

package com.luo.spring.guides.iocdi.scope;import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;@Component("nonSingleton")
@Scope("prototype")
public class Singer {private String name = "unknown";public Singer(@Value("John Mayer") String name) {this.name = name;}@Override public String toString() {return  name;}
}

1、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"xmlns:c="http://www.springframework.org/schema/c"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="nonSingleton" class="com.luo.spring.guides.iocdi.scope.Singer"scope="prototype" c:_0="John Mayer"/>
</beans>

测试

package com.luo.spring.guides.iocdi.scope.xml;import com.luo.spring.guides.iocdi.scope.Singer;
import org.springframework.context.support.GenericXmlApplicationContext;/*** @author : archer* @date : Created in 2022/11/30 20:36* @description :*/
public class Main {public static void main(String... args) {GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();ctx.load("classpath:iocdi/injection/scope/app-context-xml.xml");ctx.refresh();Singer singer1 = ctx.getBean("nonSingleton", Singer.class);Singer singer2 = ctx.getBean("nonSingleton", Singer.class);System.out.println("Identity Equal?: " + (singer1 == singer2));System.out.println("Value Equal:? " + singer1.equals(singer2));System.out.println(singer1);System.out.println(singer2);ctx.close();}
}

输出

Identity Equal?: false
Value Equal:? false
John Mayer
John Mayer

2、注解形式

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><context:component-scanbase-package="com.luo.spring.guides.iocdi.scope"/>
</beans>

测试

package com.luo.spring.guides.iocdi.scope.annotation;import com.luo.spring.guides.iocdi.scope.Singer;
import org.springframework.context.support.GenericXmlApplicationContext;/*** @author : archer* @date : Created in 2022/11/30 20:36* @description :*/
public class Main {public static void main(String... args) {GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();ctx.load("classpath:iocdi/injection/scope/app-context-annotation.xml");ctx.refresh();Singer singer1 = ctx.getBean("nonSingleton", Singer.class);Singer singer2 = ctx.getBean("nonSingleton", Singer.class);System.out.println("Identity Equal?: " + (singer1 == singer2));System.out.println("Value Equal:? " + singer1.equals(singer2));System.out.println(singer1);System.out.println(singer2);ctx.close();}
}

输出

Identity Equal?: false
Value Equal:? false
John Mayer
John Mayer

六、replaced-method

  • 性能较差
package com.luo.spring.guides.iocdi.replace;public class ReplacementTarget {public String formatMessage(String msg) {return "<h1>" + msg + "</h1>"; }public String formatMessage(Object msg) {return "<h1>" + msg + "</h1>"; }
}
package com.luo.spring.guides.iocdi.replace;import org.springframework.beans.factory.support.MethodReplacer;import java.lang.reflect.Method;public class FormatMessageReplacer implements MethodReplacer {@Overridepublic Object reimplement(Object arg0, Method method, Object[] args)throws Throwable {if (isFormatMessageMethod(method)) {String msg = (String) args[0];return "<h2>" + msg + "</h2>";} else {throw new IllegalArgumentException("Unable to reimplement method "+ method.getName());}}private boolean isFormatMessageMethod(Method method) {if (method.getParameterTypes().length != 1) {return false;}if (!("formatMessage".equals(method.getName()))) {return false;}if (method.getReturnType() != String.class) {return false;}if (method.getParameterTypes()[0] != String.class) {return false;}return true;}
}
<?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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="methodReplacer" class="com.luo.spring.guides.iocdi.replace.FormatMessageReplacer"/><bean id="replacementTarget" class="com.luo.spring.guides.iocdi.replace.ReplacementTarget"><replaced-method name="formatMessage" replacer="methodReplacer"><arg-type>String</arg-type></replaced-method></bean><bean id="standardTarget" class="com.luo.spring.guides.iocdi.replace.ReplacementTarget"/>
</beans>

测试

package com.luo.spring.guides.iocdi.replace;import org.springframework.context.support.GenericXmlApplicationContext;
import org.springframework.util.StopWatch;public class Main {public static void main(String... args) {GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();ctx.load("iocdi/injection/replace/app-context-xml.xml");ctx.refresh();ReplacementTarget replacementTarget = (ReplacementTarget) ctx.getBean("replacementTarget");ReplacementTarget standardTarget = (ReplacementTarget) ctx.getBean("standardTarget");displayInfo("replacementTarget", replacementTarget);displayInfo("standardTarget", standardTarget);ctx.close();}private static void displayInfo(String name, ReplacementTarget target) {System.out.println(target.formatMessage(name + ":Thanks for playing, try again!"));StopWatch stopWatch = new StopWatch();stopWatch.start("perfTest");for (int x = 0; x < 1000000; x++) {String out = target.formatMessage("No filter in my head");//commented to not pollute the console//System.out.println(out);}stopWatch.stop();System.out.println("1000000 invocations took: "+ stopWatch.getTotalTimeMillis() + " ms");}
}

输出

<h2>replacementTarget:Thanks for playing, try again!</h2>
1000000 invocations took: 285 ms
<h1>standardTarget:Thanks for playing, try again!</h1>
1000000 invocations took: 43 ms

七、配置文件嵌套

package com.luo.spring.guides.iocdi.nesting;public class Song {private String title;public void setTitle(String title) {this.title = title;}public String getTitle() {return title;}
}
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:c="http://www.springframework.org/schema/c"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="childTitle" class="java.lang.String" c:_0="Daughters"/><bean id="parentTitle" class="java.lang.String" c:_0="Gravity"/>
</beans>
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:c="http://www.springframework.org/schema/c"xmlns:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="song1" class="com.apress.prospring5.ch3.Song"p:title-ref="parentTitle"/><bean id="song2" class="com.apress.prospring5.ch3.Song"p:title-ref="childTitle"/><bean id="song3" class="com.apress.prospring5.ch3.Song"><property name="title"><ref parent="childTitle"/></property> </bean><bean id="childTitle" class="java.lang.String" c:_0="No Such Thing"/>
</beans>

测试

package com.luo.spring.guides.iocdi.nesting;import org.springframework.context.support.GenericXmlApplicationContext;/*** @author : archer* @date : Created in 2022/12/1 13:26* @description :*/
public class Main {public static void main(String... args) {GenericXmlApplicationContext parent = new GenericXmlApplicationContext();parent.load("classpath:iocdi/injection/nesting/parent-context.xml");parent.refresh();GenericXmlApplicationContext child = new GenericXmlApplicationContext();child.load("classpath:iocdi/injection/nesting/child-context.xml");child.setParent(parent);child.refresh();Song song1 = (Song) child.getBean("song1");Song song2 = (Song) child.getBean("song2");Song song3 = (Song) child.getBean("song3");System.out.println("from parent ctx: " + song1.getTitle());System.out.println("from child ctx: " + song2.getTitle());System.out.println("from parent ctx: " + song3.getTitle());child.close();parent.close();}
}

输出

from parent ctx: Gravity
from child ctx: No Such Thing
from parent ctx: Daughters

八、懒加载 lazy-init

  • 懒加载:指 Spring 延迟加载 bean 的属性。
  • lazy-init 的属性值为 true,这样就不会在 Spring 启动时进行实例化,而是在第一次通过 getbean 获取 bean 时实例化。
  • lazy-init=“false” 只对 scope 属性为 singleton 才有效,如果 scope 属性为 pototype,无论 lazy-init 的属性值是什么,都只在通过 getbean 时进行实例化。

1、xml 形式

package com.luo.spring.guides.iocdi.domain;import org.springframework.stereotype.Component;/*** Created by iuliana.cosmina on 2/22/17.*/
public class Guitar {public void sing(){System.out.println("Cm Eb Fm Ab Bb");}
}
package com.luo.spring.guides.iocdi.domain;/*** @author : archer* @date : Created in 2022/11/30 14:37* @description :*/
public class Singer {private String message = "Default message";private Guitar guitar;public void setMessage(String message) {this.message = message;}public String getMessage() {return message;}public void setGuitar(Guitar guitar) {this.guitar = guitar;}public void sing() {guitar.sing();}
}
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="singer"class="com.luo.spring.guides.iocdi.domain.Singer"p:guitar-ref="guitar" lazy-init="true"/><bean id="guitar"class="com.luo.spring.guides.iocdi.domain.Guitar" lazy-init="true"/>
</beans>

测试

package com.luo.spring.guides.iocdi.lazyinit;import com.luo.spring.guides.iocdi.domain.Singer;
import org.springframework.context.support.GenericXmlApplicationContext;/*** @author : archer* @date : Created in 2022/12/1 13:32* @description :*/
public class Main {public static void main(String... args) {GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();ctx.load("classpath:iocdi/injection/lazyinit/app-context-lazy-xml.xml");ctx.refresh();Singer singer = ctx.getBean("singer",Singer.class);singer.sing();ctx.close();}
}

输出

Cm Eb Fm Ab Bb

2、注解形式

package com.luo.spring.guides.iocdi.lazyinit.annotation;import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;/*** Created by iuliana.cosmina on 2/22/17.*/
@Component
@Lazy
public class Guitar {public void sing(){System.out.println("Cm Eb Fm Ab Bb");}
}
package com.luo.spring.guides.iocdi.lazyinit.annotation;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;/*** @author : archer* @date : Created in 2022/11/30 14:37* @description :*/
@Component
@Lazy
public class Singer {private String message = "Default message";private Guitar guitar;public void setMessage(String message) {this.message = message;}public String getMessage() {return message;}@Autowiredpublic void setGuitar(Guitar guitar) {this.guitar = guitar;}public void sing() {guitar.sing();}
}

测试

package com.luo.spring.guides.iocdi.lazyinit.annotation;import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.support.GenericApplicationContext;/*** @author : archer* @date : Created in 2022/12/1 13:47* @description :*/
public class Main {@Configuration@ComponentScan(basePackages = {"com.luo.spring.guides.iocdi.lazyinit.annotation"})public static class LazyConfig {}public static void main(String... args) {GenericApplicationContext ctx = new AnnotationConfigApplicationContext(LazyConfig.class);Singer singer = ctx.getBean("singer",Singer.class);singer.sing();}
}

输出

Cm Eb Fm Ab Bb

九、其他

package com.luo.spring.guides.common;import lombok.Data;
import lombok.ToString;import java.util.List;/*** @author : archer* @date : Created in 2022/9/28 17:21* @description :*/
@Data
@ToString
public class TestBean {private String testStr;private List<String> list;public TestBean() {this.testStr = "helloworld";}
}

1、使用 DefaultListableBeanFactory

<?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"><bean id="testBean" name="testBeanName" class="com.luo.spring.guides.common.TestBean"/>
</beans>

测试

package com.luo.spring.guides.iocdi.other;import com.luo.spring.guides.common.TestBean;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.xml.XmlBeanDefinitionReader;
import org.springframework.core.io.ClassPathResource;public class DefaultListableBeanFactoryMain {public static void main(String... args) {DefaultListableBeanFactory factory = new DefaultListableBeanFactory();XmlBeanDefinitionReader rdr = new XmlBeanDefinitionReader(factory);rdr.loadBeanDefinitions(new ClassPathResource("iocdi/injection/other/xml-bean-factory-config.xml"));TestBean testBean = (TestBean) factory.getBean("testBeanName");System.out.println(testBean.getTestStr());}
}

输出

helloworld

2、混合使用

package com.luo.spring.guides.iocdi.mixed;import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.ImportResource;/*** @author : archer* @date : Created in 2022/12/1 13:53* @description :*/
@ImportResource(locations = {"classpath:iocdi/injection/mixed/app-context-xml.xml"})
@Configuration
public class MixedConfiguration {
}
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"><bean id="testBean"class="com.luo.spring.guides.common.TestBean"/>
</beans>

测试

package com.luo.spring.guides.iocdi.mixed;import com.luo.spring.guides.common.TestBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;/*** @author : archer* @date : Created in 2022/12/1 13:53* @description :*/
public class Main {public static void main(String... args) {ApplicationContext ctx = new AnnotationConfigApplicationContext(MixedConfiguration.class);TestBean mr = ctx.getBean("testBean", TestBean.class);System.out.println(mr);}
}

输出

TestBean(testStr=helloworld, list=null)


http://www.ppmy.cn/news/686.html

相关文章

Pycharm 安装配置 pyQt5 图文操作(全)

目录前言1. 安装模块2. Pycharm 配置 pyQt52.1 配置QtDesigner2.2 配置PyUic2.3 配置pyrcc3. pyQt5界面前言 Qt是开源的GUI库&#xff0c;自带的QtDesigner 可以轻松构建界面&#xff0c;而且有非常全面的工具代码库和APIpyQt 是 Qt 库的Python版本&#xff0c;目前最新版本是…

Python | 数学计算那点事儿不完全总结 - 计算平均值、几何平均值等等

本文主要总结数据统计、分析过程中经历的一些数学计算实现方式。 Update: 2022 / 12 / 1 Python | 数据数学计算那点事儿不完全总结 - 计算平均值、几何平均值等等计算平均值方法示例几何平均值方法示例近似方法判断近似与否方法math.isclose()示例参考链接计算平均值 参考这…

node.js的认识与安装

一、node.js的认识 &#x1f4d6; 简单的说 Node.js 就是运行在服务端的 JavaScript。 Node.js 是一个基于 Chrome JavaScript 运行时建立的一个开源的、跨平台的JavaScript 运行时环境。 Node.js 是一个事件驱动 I/O 服务端 JavaScript 环境&#xff0c;基于 Google 的 V8 引…

【Linux】命令

常用命令 帮助&#xff08;Manual Pages&#xff0c;Manual&#xff1a;手册&#xff0c;特指参考文件&#xff09; man man <command_name> 打开目录&#xff08;change directory&#xff09; cd /etc/ cd /home 查看当前所在目录 pwd 创建一个名为 file 的文件&…

抖音用户浏览行为数据分析与挖掘

下文部分代码省略&#xff0c;完整项目代码及数据集链接&#xff1a;抖音用户浏览行为数据分析与挖掘 目录1.特征指标构建0. 项目介绍与说明**数据集说明**浏览行为1. 数据简单处理2. 特征指标构建用户指标分析&#xff1a;作者指标分析&#xff1a;作品指标分析&#xff1a;3.…

搭建gataway鉴权流程

先完善Login接口 controller RestController RequestMapping("/login") Api(value "管理API",tags "用户登录") CrossOrigin public class LoginController {Autowiredprivate IAdUserService adUserService;PostMapping("/in")Api…

C语言 结构体

C语言 结构体一、结构体的声明和初始化1. 结构体声明2. 结构体初始化二、typedef 重定义结构体三、结构体成员的类型四、结构体成员的访问五、结构体传参六、结构体的自引用七、结构体的内存对齐对齐规则程序清单1程序清单2程序清单3程序清单4修改默认对齐数一、结构体的声明和…

【使用 BERT 的问答系统】第 3 章 :词嵌入介绍

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…