一个spring程序由组件(Bean)、配置文件、容器(context)三部分组成
容器也是主程序逻辑的地方,如:
package com.test1;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class testMain {
public static void main(String[] args) {
//创建Spring上下文(加载bean.xml)
ApplicationContext acx= new ClassPathXmlApplicationContext("bean.xml");
//获取HelloWorld实例并赋值
IntrduceDemo id=acx.getBean("IntrduceDemo",IntrduceDemo.class);
id.setName("李佳奇");
id.setAge(2);
//调用方法
id.intrduce();
//销毁实例对象
((ClassPathXmlApplicationContext) acx).close();
}
}
myApp.jar是容器,假如它要依赖lib.jar创建一个新的对象p,
Person p = null; //此时只是myApp.jar依赖于lib.jar(通过接口Person),但并没有实现“注入”。
Person p = new Student(); //MyApp.jar就把Student的实例“注入”到了对象p中
但是此时是强耦合,一旦要改变p指向的对象就要修改myApp.jar的源代码
考虑到“开关原则”,主业务对修改关闭,对扩展开放。也就是说主业务myApp.jar不能修改源代码,但又要保证能拓展,也就是能改变p指向的对象。就需要这样:
此时:任何时候,只要修改Spring.xml的配置,就能改变myApp.jar中具体Person对象的注入。
https://zhuanlan.zhihu.com/p/64001753
spring配置文件总结:
spring的配置文件比较繁琐,但主要是做两件事:
1.组件(Bean)扫描。
2.自动装配:指定好bean之间的依赖(注入)。
用了组件扫描,就一定要用自动装配,反之不一定。
spring中的依赖注入又分为构造器注入和setter方法注入。
首先讲解自动配置:
1.组件扫描的自动配置:
2.指定依赖的自动配置:
手动装配:
1.利用java Config进行显式装配
2.利用XML进行显式装配。
无法从编译期的类型检查中受益。
功能不够强大。
构造器注入:目前装配集合只能通过<constructor-arg>
来实现
<constructor-arg>
<list>
<value>Sgt. Pepper's Lonely Hearts Club Band</value>
<value>With a Little Help from My Friends</value>
<value>Lucy in the Sky with Diamonds</value>
<value>Getting Better</value>
</list>
</constructor-arg>
setter注入:装配集合
/* 原始定义
private List<?> list;
private Map<String,?> map;
private Set<?> set;
private Properties props;
public void setList(List<?> list) {
this.list = list;
}
public void setMap(Map<String, ?> map) {
this.map = map;
}
public void setSet(Set<?> set) {
this.set = set;
}
*/
<bean id="collectionsSpring" class="com.zlt.spring.day02.CollectionsSpring" scope="prototype">
<property name="list">
<list>
<value>Hello World</value>
<ref bean="dbConnection"/>
</list>
</property>
<property name="map">
<map>
<entry key="key01" value="Hello World"></entry>
<entry key="key02" value-ref="dbConnection"></entry>
</map>
</property>
<property name="set">
<set>
<value>Hello World</value>
<ref bean="dbConnection"/>
</set>
</property>
<property name="props">
<props>
<prop key="key01">Hello World</prop>
<prop key="key02">liuyang</prop>
</props>
</property>
</bean>
创建一个根配置组合多个配置,在根配置中启用组件扫描
高级配置:
1.环境与profile。通过切换profile来实现对不同环境的整体切换
2.@Conditional注解:条件化的bean,是springboot实现的关键
3.处理自动装配:@Primary、@Qualifier限定符来限定唯一的装配
4.bean的作用域,@Scope
5运行时值注入:SpEL表达式
除了@Component注解,Spring容器提供了3个功能和@Component注解等同。它们分别是用于对Dao,Service及Web层的Controller进行注解
@Repository:用于对Dao实现类注解
@Service:用于对Service实现类注解
@Controller:用于对Controller实现类注解
AOP:
Spring AOP注解例子
@Before前置建议,它是在执行一个业务方法之前插入的切面
@AfterReturning,它是当一个方法正常运行后,执行的切面
@After,它是当方法执行成功或者出现异常的时候都会执行切面
@Around,它相当于一个AOP链,如果当前AOP执行后,就让下一个AOP执行
@AfterThrowing,如果在方法中有错误抛出,则执行此建议
创建环绕通知