目录
1、Spring的配置
2、Spring注解
(1)将一个类声明为Bean的注解有哪些?
(2)使用注解
(3)注入基本数据
(4)其他注解
3、Spring3.0 JavaConfig配置类
4、@Component和@Bean的区别是什么?
5、@Autowired和@Resource的区别是什么?
6、Spring框架中的常见注入方式有几种?
7、Spring中常见的ApplicationContext实现类有哪些?
8、BeanFactory和ApplicationContext有什么区别?
1、Spring的配置
- Spring2.5前版本配置为xml。
- Spring2.5版本配置为xml+annotation。
- spring3.0后版本配置为annotation+JavaConfig配置类。
2、Spring注解
就是将本来在xml中的bean引用一个类的实例换成在类上面的注解来完成一些配置文件的功能来减少配置文件的使用。
(1)将一个类声明为Bean的注解有哪些?
- @Component:定义通用Bean的注解,可标注任意类为Bean 。如果一个Bean不知道属于哪个层,可以使用 @Component 注解标注。
- @Repository:定义数据访问层Bean的注解。
- @service:定义业务层Bean的注解。
- @Controller:定义控制器Bean的注解。
(2)使用注解
首先定义两个标签:
<context:component-scan> 标签:这是Spring的一个命名空间标签,用于启用组件扫描。扫描所有被@Component注解所修饰的类,注入容器,base-package用于指定要扫描的基础包,扫描这个包及其所有子包,寻找带有特定注解的类。
<context:property-placeholder> 标签:用于启用属性占位符配置。location用于指定属性文件的位置,例如message.properties。
@Component:用于标识一个类为Spring管理的组件。
@Component
public class SomeComponent {// ...
}
@Service:专门用于服务层的注解,实际上是@Component的一个特殊化形式。(注入业务层)
@Controller:用于标识一个Spring MVC控制器类。它也是@Component的特殊化形式。(注入控制层)。
@Repository:专门用于持久层的注解,用于DAO类。它也是@Component的特殊化形式,并且支持持久化异常转换,注入数据访问层。
(3)注入基本数据
< @Vaule >
含义:注入基本数据
替换:<property></property>
修饰:成员变量或对应的set方法
语法:@Value("数据内容")
@Value("${动态获取}")
实例代码:
@Value("${msg1}")private String stuName;@Value("${msg2}")private int stuHeight;
这里是将两个属性对配置文件message.properties进行了动态获取,减少了代码耦合。
< @Autowired >
语法:@Autowired(required = "true-默认、false、是否必须进行装配")。
修饰:成员变量或对应的构造方法。
含义:按照通过set方法进行"类型装配",set方法可以省略,用于自动注入依赖。自动找到与该字段类型匹配的bean,并注入到该字段中。
注意:
- 默认是按照类型装配且同set方法
- 若容器中有一个类型可以与之匹配则装配成功,若没有一个类型可以匹配则报错 NoSuchBeanDefinitionException
- 若容器中有多个类型可以与之匹配,则自动切换为按照名称装配,若名称没有对应,则报错NoUniqueBeanDefinitionException
实例代码:
@Autowired@Qualifier(value = "dao")IUserDao dao;
UserDaoImp实现类:
@Repository(value = "dao")
public class UserDaoImp2 implements IUserDao{@Overridepublic void save() {System.out.println("===dao2的新增方法===");}
}
这里是将UserDaoImp2改名,本来默认为userDaoImp2,改名后为bean的名称为dao。然后再通过上面的@Qualifier 注解注入指定的bean名称。就可以将UserDaoImp2的对象注入给dao中。
(4)其他注解
@Primary
- 含义:首选项,当类型冲突的情况下,此注解修饰的类被列为首选(备胎扶正)
- 修饰:类
- 注意:不能单独使用,必须与@Component....联合使用
@Qualifier(value="名称")
- 含义:按照名称装配
- 修饰:成员变量
- 注意:不能单独使用,必须与@Autowired联合使用
@Resource(name="名称")
- 含义:按照名称装配
- 修饰:成员变量
- 注意:单独使用
@Scope
- 含义:配置类的作用域
- 修饰:类
- 注意:不能单独使用,必须与@Component....联合使用
- @Scope("prototype")
- @Scope("singleton")
- @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
- @Scope(ConfigurableBeanFactory.SCOPE_SINGLETON)
- @PostConstruct:初始化,修饰方法
- @PreDestroy:销毁,修饰方法
3、Spring3.0 JavaConfig配置类
(1)Spring中的新注解
@Configuration
- 作用:指定当前类是一个配置类
- 细节:当配置类作为AnnotationConfigApplicationContext对象创建的参数时,该注解可以不写。
@Configuration
标识这个类是一个配置类,Spring会将其作为配置文件来处理,类似于传统的XML配置文件。
@ComponentScan
- 作用:用于通过注解指定spring在创建容器时要扫描的包
- 属性:value:它和basePackages的作用是一样的,都是用于指定创建容器时要扫描的包。
- 替换:<context:component-scan base-package="com.apesource"></context:component-scan>
@ComponentScan(basePackages = "com.apesource")
指定Spring扫描com.apesource包及其子包中的组件(比如使用了@Component、@Service、@Repository、@Controller注解的类),并将这些组件注册为Spring应用上下文中的Bean。
@PropertySource
- 作用:用于指定properties文件的位置
- 属性:value:指定文件的名称和路径。
- 配合@Value使用
- 替换:<context:property-placeholder location="classpath:message.properties"></context:property-placeholder>
@PropertySource(value = "classpath:message.properties")
指定Spring加载类路径下的message.properties文件,用于配置属性值(例如,可以用@Value注解注入属性值)。
@Bean
- 作用:用于把当前方法的返回值作为bean对象存入spring的容器中。
- 属性:name:用于指定bean的id。当不写时,默认值是当前方法的名称。
@Bean
public IUserDao dao(){return new UserDaoImp();
}@Bean
public IUserService service(/*@Autowired*/ IUserDao dao){return new UserServiceImp(dao);
}@Bean
public IUserController controller(/*@Autowired*/ IUserService service){return new UserControllerImp(service);
}
@Bean方法是在Spring容器初始化时被调用的。AnnotationConfigApplicationContext对象并传入配置类ApplicationConfig.class时,Spring容器开始初始化,并调用所有带有@Bean注解的方法来注册这些Bean。
ApplicationContext applicationContext = new AnnotationConfigApplicationContext(ApplicationConfig.class);
IUserController controller = (IUserController) applicationContext.getBean("controller");
controller.save();
当你创建AnnotationConfigApplicationContext对象并传入ApplicationConfig.class时,Spring容器开始初始化。通过"controller"这个id来调用容器中的Bean来完成实例化对象。
@Import
- 作用:用于导入其他的配置类
- 属性:value:用于指定其他配置类的字节码。
- 例子:@Import(SystemSpringConfig.class)
@Import(TestConfig.class)
4、@Component和@Bean的区别是什么?
@Component注解作用于类,而@Bean注解作用于方法。
@Component通常是通过类路径扫描来实现自动扫描并完成装配Bean到Spring IOC容器中。
@Bean注解通常用于注解某个方法,通过@Bean注解告诉了Spring IOC容器,该方法的返回值实例是一个Bean 。
5、@Autowired和@Resource的区别是什么?
@Autowired是 Spring提供的注解,@Resource是JDK提供的注解。
@Autowired默认的注入方式为byType(按类型自动注入),@Resource默认注入方式为 byName(按名称自动注入)。
6、Spring框架中的常见注入方式有几种?
记忆关键字:整体介绍三种注入方式、分别介绍每个注入方式的细节。
Spring IOC有三种注入方式:构造注入、Setter注入、属性注入;
- 构造注入:使用构造方法注入bean;
- Setter注入:使用Setter方法注入bean;
- 属性注入:使用成员属性注入bean,不推荐。原因:使用私有的成员属性变量,依靠反射实现,破坏封装,只能依靠IOC容器实现注入,不严谨;
7、Spring中常见的ApplicationContext实现类有哪些?
记忆关键字:分别介绍每种实现类或子接口。
ClassPathXmlApplicationContext:根据项目类路径classpath下的配置文件加载bean;
FileSystemXmlApplicationContext:根据当前磁盘的一个绝对系统文件路径下的配置文件加载bean;
AnnotationConfigApplicationcontext:根据读取到的注解加载bean ;
webApplicationContext:web容器下按照配置文件加载 bean;
8、BeanFactory和ApplicationContext有什么区别?
记忆关键字:两者之间的关系、区别与不同、Bean的创建加载方式。
两者之间的关系: BeanFactory和ApplicationContext是 Spring的两大核心接口,都可以当做Spring 的容器;
两者区别与不同:
- BeanFactory是 Spring里面最底层的接口,是Ioc的核心,定义了Ioc的基本功能,包含了各种Bean的定义、加载、实例化,依赖注入和生命周期管理等行为;
- ApplicationContext接口作为BeanFactory 接口的子接口,包含BeanFactory所具备的功能外,还提供了其它框架功能:继承MessageSource(支持国际化),资源文件访问、可以同时加载多个配置文件、可以通过监听器管理bean的生命周期;
Bean的创建加载方式:
- BeanFactroy采用的是延迟加载形式来注入Bean,只有在使用到某个Bean时,才对该Bean进行加载实例化。这样不能提前发现一些存在的 Spring 的配置问题。如果 Bean的某一个属性没有注入,BeanFacotry加载后,直至第一次使用调用getBean()方法才会抛出异常;
- ApplicationContext是在容器启动时,一次性创建了所有的 Bean。这样,在容器启动时,我们就可以发现Spring 中存在的配置错误,这样有利于检查所依赖属性是否注入。ApplicationContext 启动后预载入所有的单实例 Bean,所以在运行的时候速度比较快,因为它们已经创建好了。相对于 BeanFactory , ApplicationContext唯一的不足是占用内存空间,当应用程序配置Bean较多时,程序启动较慢;