八、Spring基于Annotation装配Bean对象
在Spring中,尽管使用xml配置可以实现Bean的装配工作,但是如果应用中Bean的数量较多,会导致xml配置文件过于臃肿,造成维护困难。Spring框架提供一些用于装配Bean对象的注解,来替换xml文件配置方式。
1 jar包依赖
spring核心容器模块
beans
context
core
expression
spring aop模块
aop
日志
comons-logging
2 spring配置文件中开启注解扫描
context:component-scan base-package=“扫描注解的包名”
3 注册bean对象
3.1 @Component
可以作用任何层次。一般是非业务层,控制层,持久层的类用这个。
3.2@Service
作用业务层。
3.3@Repository
持久层。
3.4@Controller
spring mvc中控制层。
代码测试。使用spring获取管理的对象id查看对象有没有被实例化,id是什么。
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:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
">
<context:component-scan base-package="com.bjsxt"/>
</beans>
持久层
package com.bjsxt.dao;
public interface UsersDao {
}
package com.bjsxt.dao.impl;
import com.bjsxt.dao.UsersDao;
import org.springframework.stereotype.Repository;
@Repository("suibianDao")
public class UsersDaoImpl implements UsersDao {
}
业务层
package com.bjsxt.service;
public interface UsersService {
}
package com.bjsxt.service.impl;
import com.bjsxt.service.UsersService;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
//@Component
@Service("suibian")
public class UsersServiceImpl implements UsersService {
}
测试
package com.bjsxt.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
// 获取id名
String [] ids = applicationContext.getBeanDefinitionNames();
for (String id:ids) {
System.out.println(id);
}
}
}
运行结果
默认id名是类名首字母小写。加入参数后名称改变为自定义字符串名称。
4 Bean对象依赖注入注解
4.1@Autowired
对成员变量,方法,构造方法标注,完成Bean的自动注入处理。按类型。
spring框架启动后,扫描有注解的包中的所有类,对于有@Comonent的类实例化,加到hashmap中管理。有@Autowired的变量,去寻找类型一样的,把变量注入。
4.2@Resource
是javax下的类。spring 根据bean id找对象,找不到再根据类型找对象。
4.3@Qualifier
与@Autowired配合使用,将按照类型找,转变成按照bean id找。名称是@Qualifier参数。
4.4@Value
获取properties文件中的值。
代码
运行结果
5Spring配置相关注解
5.1@Configuration
声明当前类为配置类,相当于xml形式的spring配置,该注解要加到类上。
5.2@Bean
注解在方法上,声明当前方法的返回值为一个Bean对象,该对象会被添加在springioc容器中,和标签的作用相同。bean的实例名称由@Qualifier注解的参数指定,
代码:使用配置注解实例化持久层对象,在测试类中打印它的id,并打印它本身。
package com.bjsxt.config;
import com.bjsxt.dao.UsersDao;
import com.bjsxt.dao.impl.UsersDaoImpl;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
//相当于配置文件中配置bean
//springframework中不能去掉xml
@Configuration
public class SpringConfig {
@Bean
public UsersDao usersDaoInit(){
return new UsersDaoImpl();
}
}
package com.bjsxt.dao.impl;
import com.bjsxt.dao.UsersDao;
import org.springframework.stereotype.Repository;
//@Repository("suibianDao")
public class UsersDaoImpl implements UsersDao {
}
package com.bjsxt.test;
import com.bjsxt.dao.UsersDao;
import com.bjsxt.service.UsersService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
// 获取id名
String [] ids = applicationContext.getBeanDefinitionNames();
for (String id:ids) {
System.out.println(id);
}
// 输出对象
UsersDao usersDaoInit = (UsersDao)applicationContext.getBean("usersDaoInit");
System.out.println("ud "+usersDaoInit);
//UsersService us = (UsersService)applicationContext.getBean("suibian");
//UsersDao ud = (UsersDao)applicationContext.getBean("suibianDao");
//System.out.println("us "+us);System.out.println("ud "+ud);
}
}
运行结果
id是方法名。spring扫描包时候会把配置类也管理起来。