定义
IOC(Inversion of Control),即控制反转:对象的创建控制权不再由程序来执行,而是交由给Spring容器处理。简单的说程序不需要进行new操作,对象直接由Spring容器自动创建。
DI(Dependency Injection),即依赖注入:Spring容器为程序运行时提供所需要的资源(对象)。
Bean对象:IOC容器中进行管理、创建的对象。
主要由@Component、@Service、@Controller、@Repository、@Autowired、@Qualifier、@Resource注解体现。
@Component是通用注解,其他三个注解是这个注解的衍生注解,并且具有了特定的功能。
@Controller层是spring-mvc的注解,用于标注控制层组件,并查看是否处理请求转发,重定向。
@Service层是业务逻辑层注解,这个注解只是标注该类处于业务逻辑层。
@Repository注解在持久层中,标注 DAO 类,具有将数据库操作抛出的数据访问异常自动转换(封装)为spring的持久层异常的功能。
所有在与主程序同级目录或子包中标记的注解会被ComponentScan(组件扫描器)识别并在Spring容器中创建相应的java bean。bean的名字是类名的首字母小写(Admin->admin)。
@Autowired 体现了依赖注入的思想,从容器中获取对象,不再需要通过new创建对象,就可以自动根据容器中符合条件的bean进行创建(接口实现类)。默认按类型进行注入,
@Qualifier 一般配合Autowired进行使用,可以指定特定Bean类名。
@Resource是jdk提供的注解,而@Autowired、@Qualifer都是Spring提供的注解。@Resource也是通过Bean的类名来直接注入。
程序实例
Dao层:ArraysDao返回[1,2,3]集合
public interface BasicDao<E> {List<E> getData();
}@Repository //标识对象是数据存储对象,并且在容器中创建bean
public class ArraysDao implements BasicDao<Integer> {@Overridepublic List<Integer> getData() {ArrayList<Integer>arrayList=new ArrayList<>();arrayList.add(1);arrayList.add(2);arrayList.add(3);return arrayList;}
}
Service层:通过Dao层获取数据集合
public interface BasicService {List<Integer> getArray();
}@Service //将对象标识为Service对象,并在容器中创建bean
public class ArrayService implements BasicService{@AutowiredBasicDao arraysDao;@Overridepublic List<Integer> getArray() {return arraysDao.getData();}
}
Controlloer层:
@RestController // =@ResponseBody +@Controller 标识是控制器对象
public class TestController {@Autowired //依赖注入,会自动注入符合BasicService接口的beanBasicService arrayService;@RequestMapping("/test")public List<Integer> test(){System.out.println(arrayService.getArray());return arrayService.getArray();}
}
在程序运行时可以在该界面看到对应注解生成的java Bean。