自己学习了主流的Spring框架,先总结一下IoC和DI,之后会补上AOP
IoC
IoC:控制反转,简单的说就是创建对象的时候原来是由开发人员自己维护,new一个对象,现在有了spring后,对象的创建以及依赖关系可以由spring完成以及注入,大大降低了耦合。
DI
DI:依赖注入,将一些类交给spring管理,需要用到这些类的时候,不再是自己去定义了,而是直接向spring容器索取,当spring容器知道你的需求之后,就会去它所管理的组件中查找,然后直接给你所需要的组件。
1、设值注入:在applicationContext中使用name来指定注入哪个属性,如果注入的是一个bean,则直接使用ref连接到另一个bean即可。
2、构造注入:构造注入的Element为constructor-arg,构造注入主要有三种形式,第一种是使用value来直接注入值,但是顺序必须和构造器中的参数顺序一致;
第二种是使用index索引来注入值,索引值的第一位是0;
第三种是使用name来注入值,这是较常用的方式。
3、P命名空间和C命名空间
使用P命名空间和C命名空间需要在<beans>中引入规范:xmlns:p="http://www.springframework.org/schema/p"、xmlns:c="http://www.springframework.org/schema/c"
可以使用P:name、p:age等形式注入值;C命名空间和P命名空间类似。
4、自动注入:自动注入也有两种方式,第一种是ByName方式,byName会从容器中查找与实体类的域属性同名的bean的id,并将该bean自动注入给该域属性,在<bean>需要指定autowire属性为ByName。看一个简单的ByName的例子代码:
这是一个Student的POJO类:
省略了getter、setter方法;以及省略重写的toString方法。
这是一个School的POJO类:
写完两个POJO类之后,需要在配置文件中注册:
注册之后可以在测试类中进行测试:
path中的路径是applicationContext.xml配置文件在包中的Qualified Name。
第二种是ByType方式,byType会从容器中查找与实体类的域属性相同的bean,并将该bean自动注入给该域属性,在<bean>需要指定autowire属性为ByType。
5、注解注入:注解注入需要在配置文件中设置组件扫描器,<context:component-scan base-package=".........."></context:component-scan>
base-package的几种写法:
1.com.java.spring.first:扫描com.java.spring.first及其子包
2. com.java.spring.second.*:扫描com.java.spring.second这个包的子包
在POJO类中,使用@Component("")来指定该类为bean对象,使用@Value("")来给这个bean注入值;
如果要使用自动注入,则使用@Autowired,该属性默认为ByType方式,如果指定要用ByName方式,则要求@Autowired和@Qualifier联合使用。
另外补充与@Component注解功能相同,但意义不同的注解:
1、@Repository:注解在Dao实现类上
2、@Service:注解在service实现类上
3、@Controller:注解在SpringMVC的处理器上
6、JavaCondig注入:也需要在配置文件中设置组件扫描器,<context:component-scan base-package="..........">
创建一个javaConfig类来管理,使用@Configuration注解表示当前类充当Spring容器,即所有的bean将由这个类来创建,使用@Bean(name="student",autowire=Autowire.BY_TYPE)来指定bean以及自动注入的方式。
下面是简单的javaConfig类: