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