1.什么是Spring的IOC
Spring 是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架,
解决了企业应用开发的复杂性,适用范围是一切 Java 应用。
IOC:控制反转,指的是spring以前,对象都是自己new去创建,
现在通过spring的配置文件,由spring容器负责创建,控制权发生了转移,所以叫控制反转。
IOC别名,也叫DI 就是依赖注入,由容器动态的将某种依赖关系注入到组件中。
2.新建user实体类
public class SysUser {
private Integer id;
private String username;
private String telephone;
... set get 省略
}
3.resources下新建一个spring配置文件ApplicationContext.xml:
<bean id="user" class="com.org.pojo.SysUser">
<property name="id" value="1"></property>
<property name="username" value="张三"></property>
<property name="telephone" value="13898987676"></property>
</bean>
4.获取XML中的Bean
4.1 通过id和类型获取Bean:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"/ApplicationContext.xml"})
public class TestSpring {
@Test
public void testGetBeanById(){
// 通过id获取Bean
ApplicationContext ac = new ClassPathXmlApplicationContext("ApplicationContext.xml");
SysUser user = (SysUser) ac.getBean("user");
System.out.println(user); // SysUser [id=1, username=张三, telephone=13898987676]
}
@Test
public void testGetBeanByType(){
// 通过类型获取Bean
ApplicationContext ac = new ClassPathXmlApplicationContext("ApplicationContext.xml");
SysUser user = ac.getBean(SysUser.class);
System.out.println(user); // SysUser [id=1, username=张三, telephone=13898987676]
}
}
4.2 通过 spring 的 @Autowired 注解自动注入:根据类型注入
@Autowired
private SysUser user;
@Test
public void testAutowired(){
System.out.println(user); //SysUser [id=1, username=张三, telephone=13898987676]
}
5 .Seivice注解
新建UserService接口 和 UserServiceImpl 实现类,并实现该接口
public interface UserService {
SysUser getUser(int id);
}
@Service("UserServiceImpl")
public class UserServiceImpl implements UserService{
public SysUser getUser(int id) {
// 模拟数据库查询,根据id 获取一条数据
SysUser sysUser = new SysUser();
sysUser.setId(id);
sysUser.setTelephone("13899990000");
sysUser.setUsername("李四");
return sysUser;
}
}
进行测试:
@Test
public void test(){
// 使用spring之前,New对象
UserService userService = new UserServiceImpl();
System.out.println(userService.getUser(1));
}
在XML中进行配置:
<bean id="userService" class="com.org.service.impl.UserServiceImpl">
测试:
@Test
public void test(){
// 使用spring的 xml配置
ApplicationContext ac = new ClassPathXmlApplicationContext("ApplicationContext.xml");
UserService userService1 = (UserService) ac.getBean("userService");
System.out.println(userService1.getUser(1)); // SysUser [id=1, username=李四, telephone=13899990000]
}
Spring除了在XML中进行配置,还可以进行注解配置:
applicationContext.xml 中配置 <context:component-scan base-package="com" />
配置完这个标签后,spring就会去自动扫描base-package对应的路径或者该路径的子包下面的java文件,如果扫描到文件中带有@Service,@Component,@Repository,@Controller等这些注解的类,则把这些类注册为bean。
<context:component-scan base-package="com"/>
注解测试:
@Autowired
private UserService userService;
@Test
public void test(){
// 使用注解
System.out.println(userService.getUser(1)); // SysUser [id=1, username=李四, telephone=13899990000]
}
6.@Autowired和@Qualifier使用
如果有其它实现类也实现了 UserService 接口,@Autowired private UserService userService; 怎么知道注入的是哪个实现类?
新建是一个实现类 NewUserServiceImpl 实现 UserService 接口
@Service("NewUserServiceImpl")
public class NewUserServiceImpl implements UserService {
public SysUser getUser(int id) {
// 模拟数据库查询,根据id 获取一条数据
SysUser sysUser = new SysUser();
sysUser.setId(id);
sysUser.setTelephone("13888888888");
sysUser.setUsername("王五");
return sysUser;
}
}
再次运行test方法,控制台报错:
NoUniqueBeanDefinitionException: No qualifying bean of type 'com.org.service.UserService' available: expected single matching bean but found 2:
newUserServiceImpl,userServiceImpl
NoUniqueBeanDefinitionException 异常,就是说 bean 不是唯一的。我们可以使用 @Qualifier 注解 和 @Autowired 保证唯一性。
@Autowired
@Qualifier("NewUserServiceImpl")
private UserService userService;
@Test
public void test(){
// 使用注解
System.out.println(userService.getUser(1)); // SysUser [id=1, username=王五, telephone=13888888888]
}
spring 的 @Autowired 是根据类型注入的,byType 通过参数的数据类型自动自动装配
7.@Resource 注解
我们也可以使用 @Resource 注解 实现 @Autowired和 @Qualifier 连用的效果
@Resource是属于J2EE ,JDK1.6支持的注解byName 通过参数名 自动装配。
@Resource(name = "UserServiceImpl")
private UserService userService;
@Test
public void test(){
// 使用注解
System.out.println(userService.getUser(1)); // SysUser [id=1, username=李四, telephone=13899990000]
}
本文暂时没有评论,来添加一个吧(●'◡'●)