Spring4.0学习笔记 第二章 Javaconfig 显式装配(中)

原创 2017年01月03日 23:06:14

构造器注入

目录结构:

CDConfig:

package config;


import interfaces.ConstuctBean;
import interfaces.DiskImpl;
import interfaces.DiskInterface;


import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


@Configuration   //表示配置文件
public class CDConfig {
	
	@Bean //该注解等效xml中的<bean>标签配置,spring容器会将所有带@Bean的方法生成实例存放于容器之中
	//生成的bean ID名 默认为方法名, 该bean作为构造器注入下面方法
	public ConstuctBean getCbean(){
		return new ConstuctBean();
		
	}


	
	@Bean //该注解等效xml中的<bean>标签配置,生成的bean名 默认为方法名(首字母小写)
	public  DiskInterface getDisk(){
		//getCbean()上不加@Bean注释 我们也是能正常的获取ConstuctBean的实例的,只不过每次获取的都是新的对象,
		//而加了@Bean注解,,Spring会拦截所有对它的调用,并确保直接返回该方法所创建的bean,而不是每次都对其进行实际的调用
		//也就是不是每次都生成实例,spring默认生成实例策略为单例模式
		return new DiskImpl(getCbean());
		
	}
	
}


ConstutBean:(作为构造器参数)

package interfaces;

public class ConstuctBean {
	
	public void con(){
		System.out.println("我是构造器注入bean");
	}

}
DiskImpl(DiskInterface接口的实现):

package interfaces;


public class DiskImpl implements DiskInterface {
	
	private ConstuctBean cb;
	

	public DiskImpl(ConstuctBean cb){
		this.cb=cb;
	}

	public void play() {
		cb.con();
		//输出对象句柄
		System.out.println(cb);
	}

}

调用测试代码:

CDPlayer:

package interfaces;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import config.CDConfig;


public class CDPlayer {
	
		public static void main(String[] args) {
			//JavaConfig上下文,加载配置文件
			AnnotationConfigApplicationContext ac = 
					new AnnotationConfigApplicationContext(CDConfig.class);
			DiskImpl ip=(DiskImpl) ac.getBean("getDisk");
			ip.play();
			
		}

}

输出:我是构造器注入bean
interfaces.ConstuctBean@56dacb7


现在将Config文件拆分成两个:

分别为CDConfig 和CDConfig1


CDConfig:

package config;


import interfaces.ConstuctBean;
import interfaces.DiskImpl;
import interfaces.DiskInterface;


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Import(CDConfig1.class)//导入CDConfig1配置文件合成一个
@Configuration   //表示配置文件
public class CDConfig {
	@Autowired //自动注入
	private ConstuctBean cb;


	
	@Bean //该注解等效xml中的<bean>标签配置,生成的bean名 默认为方法名(首字母小写)
	public  DiskInterface getDisk(){
		//getCbean()上不加@Bean注释 我们也是能正常的获取ConstuctBean的实例的,只不过每次获取的都是新的对象,
		//而加了@Bean注解,,Spring会拦截所有对它的调用,并确保直接返回该方法所创建的bean,而不是每次都对其进行实际的调用
		//也就是不是每次都生成实例,spring默认生成实例策略为单例模式
		return new DiskImpl(cb);
	 //还有一种方式:
	  //将 @Autowired 
	  // private ConstuctBean cb; 
       // 这两行去掉,然后在public  DiskInterface getDisk()中加入参数变成public  DiskInterface getDisk(ConstuctBean cb),
		//这样虽然ConstuctBean实例在CDConfig1文件中,CDConfig1中生成的ConstuctBean实例会注入给参数cb




		
	}
	
}
CDConfig1:

package config;

import interfaces.ConstuctBean;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class CDConfig1 {
	
	@Bean //该注解等效xml中的<bean>标签配置,spring容器会将所有带@Bean的方法生成实例存放于容器之中生成的bean ID名 默认为方法名,
//     该注解必须有,否则的话autowired自动注入发现容器中没有生成的ConstuctBean 实例,会发生注入错误
// 注入的前提是 已生成该bean 实例,才能正确注入
	public ConstuctBean getCbean(){
		return new ConstuctBean();
		
	}

}


package interfaces;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import config.CDConfig;


public class CDPlayer {
	
		public static void main(String[] args) {
			//JavaConfig上下文,加载配置文件
			AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(CDConfig.class);
			DiskImpl ip=(DiskImpl) ac.getBean("getDisk");
			ip.play();
			
		}

}

输出:我是构造器注入bean
interfaces.ConstuctBean@667cc058


JavaConfig 和XML配置混用


TotalConfig:

package soundsystem;

import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.ImportResource;

@Configuration
@Import({CDConfig.class})//引入另一个javaconifg配置文件
//引入xml配置文件
@ImportResource("classpath:application.xml")
public class TotalConfig {
	

}
CDConfig:

package soundsystem;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class CDConfig {
	@Bean
	public DiskImpl getDk(ConstBean cb){
		
		return new DiskImpl(cb);
		
	}

}
ConstBean:

package soundsystem;

public class ConstBean {
	
	public void con(){
		System.out.println("我是构造器参数bean");
	}

}
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"
  xmlns:p="http://www.springframework.org/schema/p"
  xmlns:util="http://www.springframework.org/schema/util"
 xsi:schemaLocation="http://www.springframework.org/schema/beans
  http://www.springframework.org/schema/beans/spring-beans.xsd 
  http://www.springframework.org/schema/util
  http://www.springframework.org/schema/util/spring-util.xsd">
 	
 	<bean  class="soundsystem.ConstBean">
 	
 	</bean>

 </beans>

Test:

package soundsystem;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {
	
		public static void main(String[] args) {
			AnnotationConfigApplicationContext ac =
					new AnnotationConfigApplicationContext(TotalConfig.class);
			ac.getBean("getDk", DiskImpl.class).play();
//			ClassPathXmlApplicationContext ac = 
//					new ClassPathXmlApplicationContext("application.xml");
//			ac.getBean("getDk", DiskImpl.class).play();
			
		}

}
输出:
sing song
我是构造器参数bean



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

spring笔记:第二章(通过javaconfig类装配bean)

javaconfig装配bean

《Spring实战》学习笔记(二)JavaConfig @Import 和 @ImportResource注解的使用

最近在看《spring in Action 4th》,讲到JavaConfig的@Import和@ImportResource的使用,于是照着例子做了个小demo,加深自己的印象。在Spring中配置...

并发编程实战学习笔记(九)-显式锁

为什么创建一种与内置锁如此相似的新加锁规则(显示锁)?内置锁的局限 无法中断一个正在等待锁的线程,或者获取锁时不支持超时操作。 内置锁必须在获取锁的代码块中释放,这就简化了编码工作,并且与异常处理操作...

C++学习笔记59——函数模板的显式实参

1,引入 通常,函数模板的类型形参的具体类型是通过输入的实参的类型推断出来的。但也有例外,那就是显式实参——直接给出函数模板的形参类型,不用推断。 比如标准库algorithm头文件里的max()...

我的java学习笔记(22)关于在框架中显式信息

java学习笔记

安卓学习笔记(一)显式Intent与隐式Intent

1、显式Intent Intent intent = new Intent(FirstActivity.this, SecondActivity.class); startActivity(inten...

C++学习笔记16,C++11中的显式的默认构造函数以及显示删除默认构造函数

在早期的C++中,如果需要一个不接收任何参数的构造函数C++11中提供了

opencv学习笔记之两幅图像显式融合

图像显式融合 即通过下式 将两幅图像相互叠加,alpha控制那幅图像在融合图像中所占的权重。 下面以如下两幅图像通过addWeighted()函数来实现。          ...

Spring4.0学习笔记005——Bean的配置三(基于XML文件)

Spring Bean的xml配置

Spring4.0学习笔记--整合Hibernate

•Spring 支持大多数流行的 ORM 框架, 包括 Hibernate JDO, TopLink, Ibatis 和 JPA。 •Spring 对这些 ORM 框架的支持是一致的, 因此可以把和 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)