全注解下的spring IOC之装配bean的几种情况和方式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wu2374633583/article/details/83382971

IOC容器的功能

BeanFactory和ApplicationContext接口设计如下:
在这里插入图片描述
在这里插入图片描述

public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,
		MessageSource, ApplicationEventPublisher, ResourcePatternResolver {

通过@Bean装载bean

使用到的注解: @Configuration @Bean

简单案例:

实体类model

package com.wuk.springbootJSP;

public class User {

	private Long id;
	private String userName;
	private String note;
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getNote() {
		return note;
	}
	public void setNote(String note) {
		this.note = note;
	}
	@Override
	public String toString() {
		return "User [id=" + id + ", userName=" + userName + ", note=" + note
				+ "]";
	}
	
	
}

配置类

package com.wuk.springbootJSP;

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

//表示这是一个配置文件
@Configuration
public class AppConfig {

	//表示生成的model会被装配到IOC容器,name就是model的名称,如果不写就是initUser方法名
	@Bean(name="user")
	public User initUser(){
		
		User user=new User();
		user.setId(1L);
		user.setUserName("userName1");
		user.setNote("note1");
		return user;
	}
}

测试类

package com.wuk.springbootJSP;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class IocTest {

	public static void main(String[] args) {
		
		ApplicationContext app=new AnnotationConfigApplicationContext(AppConfig.class);
		User user=(User) app.getBean("user");
		
		System.out.println(user);
	}
}

结果:

User [id=1, userName=userName1, note=note1]

通过扫描装配你的bean

使用到的注解:@Component @Value @ComponentScan @Configuration
实体类

package com.wuk.demo2;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

//表示这个类将被springIOC容器扫描装配
@Component("user")
public class User {

	//注入值
	@Value("22")
	private Long id;
	@Value("wuk")
	private String userName;
	@Value("note02")
	private String note;
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getNote() {
		return note;
	}
	public void setNote(String note) {
		this.note = note;
	}
	@Override
	public String toString() {
		return "User [id=" + id + ", userName=" + userName + ", note=" + note
				+ "]";
	}
	
	
}

配置类

package com.wuk.demo2;

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

//表示它会进行扫描,只扫描该类所在额包和子包
@ComponentScan
//表示这是一个配置文件
@Configuration
public class AppConfig {
	
}

测试类

package com.wuk.demo2;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class IocTest {

	public static void main(String[] args) {
		
		ApplicationContext app=new AnnotationConfigApplicationContext(AppConfig.class);
		User user=(User) app.getBean("user");
		
		System.out.println(user);
	}
}

ComponentScan注解接口源码分析
常用的几个方法:

//定义扫描的包
@AliasFor("basePackages")
	String[] value() default {};
//定义扫描的包
@AliasFor("value")
	String[] basePackages() default {};
//定义扫描的类
Class<?>[] basePackageClasses() default {};
//当满足过滤器条件时扫描
Filter[] includeFilters() default {};
//当不满足过滤器条件时扫描
Filter[] excludeFilters() default {};
//是否延迟初始化
boolean lazyInit() default false;

现在我们将User.java换一个包com.wuk.model,然后这样配置也可以扫描到:

package com.wuk.demo2;

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

//表示它会进行扫描,只扫描该类所在额包和子包
@ComponentScan(basePackages={"com.wuk.model"})
//表示这是一个配置文件
@Configuration
public class AppConfig {
	
}

或者

package com.wuk.demo2;

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

//表示它会进行扫描,只扫描该类所在额包和子包
@ComponentScan("com.wuk.model")
//表示这是一个配置文件
@Configuration
public class AppConfig {
	
}

或者

package com.wuk.demo2;

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

import com.wuk.model.User;

//表示它会进行扫描,只扫描该类所在额包和子包
@ComponentScan(basePackageClasses={User.class})
//表示这是一个配置文件
@Configuration
public class AppConfig {
	
}

装配第三方Bean

现实中,我们经常需要引入第三方包,并且将第三方的包的类对象放入到springIOC容器中,这时候@Bean注解就可以发挥作用了。
比如引入mysql和dbcp三方包,并将其类对象加入到容器中:

		<dependency>
		    <groupId>mysql</groupId>
		    <artifactId>mysql-connector-java</artifactId>
		    <version>8.0.13</version>
		</dependency>
		<dependency>
		    <groupId>org.apache.commons</groupId>
		    <artifactId>commons-dbcp2</artifactId>
		    <version>2.1.1</version>
		</dependency>
		<dependency>
		    <groupId>org.apache.commons</groupId>
		    <artifactId>commons-pool2</artifactId>
		    <version>2.6.0</version>
		</dependency>

配置类

package com.wuk.demo3;

import java.util.Properties;

import javax.sql.DataSource;

import org.apache.commons.dbcp2.BasicDataSourceFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

//表示它会进行扫描,只扫描该类所在额包和子包
@ComponentScan(basePackages={"com.wuk.model"})
//表示这是一个配置文件
@Configuration
public class AppConfig {
	
	@Bean(name="dataSource")
	public DataSource getDataSource(){
		
		Properties  prop=new Properties();
		prop.setProperty("driver", "com.mysql.jdbc.Driver");
		prop.setProperty("url", "jdbc:mysql://132.232.70.228:3306/qinhe");
		prop.setProperty("username", "root");
		prop.setProperty("password", "root");
		DataSource dataSource=null;
		try {
			dataSource=BasicDataSourceFactory.createDataSource(prop);
		} catch (Exception e) {

			e.printStackTrace();
		}
		
		return dataSource;
	}
}

测试类

package com.wuk.demo3;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class IocTest3 {

	public static void main(String[] args) {
		
		ApplicationContext app=new AnnotationConfigApplicationContext(AppConfig.class);
		
		
		System.out.println(app.getBean("dataSource"));
	}
}

结果:

org.apache.commons.dbcp2.BasicDataSource@6c64cb25

猜你喜欢

转载自blog.csdn.net/wu2374633583/article/details/83382971
今日推荐