软件设计六大原则
高内聚,低耦合
DI: Dependency Injection 依赖注入
IOC: Inversion of Control 控制反转
Spring的beans.xml文件
引入约束,解析XML的规定
<beans>
标签的 xmlns xmlns:xsi xsi:schemaLocation属性
规定:
id和name都是用来表示给创建的对象取的名字
id是之前版本的写法,不可以使用特殊符号
name 可以使用一些特殊符号,所以现在基本都要name
<bean name="userDao" bean="对象的地址">
<bean name="userService" bean="对象的地址">
property标签是当前bean创建的对象里面的成员变量
name是成员变量的名,ref是另一个bean标签创建的对象的name名,
就是那个bean创建的对象
<property name="userDao" ref="指向的bean标签创建的对象 例如userDao"></property>
</bean>
通过构造方法注入
1 UserService 中提供对应的构造方法
2 beans.xml中进行设置
注入普通属性(非引用)
1 dao提供对应的变量
2 beans.xml进行配置
xml的<property>
标签
对象用ref指向,普通属性用value=“值” 设置
3 测试
xml中bean标签的属性
scope="" 属性值prototype非单例模式 默认是单例模式
autowire:自动装配
byName : 根据名字进行匹配
1 成员变量名字 ×
2 set方法名字 √
3 方法的参数列表名字 ×
byType: 根据set方法的参数列表类型进行注入,
如果beans.xml中出现了多个能匹配的对象时会出错
init-method:初始化对应的方法
destroy-method:销毁时对应的方法
init-method="" destroy-method=""
设置集合的值
1
//销毁spring容器
//对象中自定义的destroy方法,必须要销毁spring容器的时候才会执行,
//如果scope设置的是singleton 的时候 对象的声明周期才会和spring容器绑定,那么
//但是如果是prototype的时候,对象的声明周期不归spring管理,所以即使设置了destroy-method
ClassPathXmlApplicationContext对象的 destroy()方法,
//销毁并不是销毁对象 ,而是进行资源释放,所以,我们可以再销毁语句之后,继续使用userService对象
迟加载
默认情况下,在调用new ClassPathXmlApplicationContext(“beans.xml”);
的时候,会自动创建对象
迟加载: 用到的时候再创建lazy-init=“true” 这时候在getBean的时候才会创建对象,并init初始化
可以对beans标签设置 属性default-lazy-init=“true” 让所有bean都迟加载
如果beans和bean都有迟加载,并且一个是true,一个是false,bean的优先级高
注解注入 --Autowired
1 导包 spring-aop-4.2.1.RELEASE.jar
2 更改beans.xml
引入约束和配置
设置注解方式注入
xml文件中 <context:annotation-config />
类中 @Autowired 加在方法或者变量上 如果写在set方法上,就用set方法注入
如果写在变量上就用变量注入就不会调用方法
@Autowire 默认是byType: 根据set方法的参数列表类型进行注入,
如果beans.xml中出现了多个能匹配的对象时自动变为byName: 根据set方法参数列表变量名注入(这里跟非注解不一样)
@Autowire 手动改为byName:
在set方法的参数里写(@Qualifier(“找的xml里面的对象名”))
如果没找到报错, 那么设置@Autowire(required=false)就不会报错,控制台打印null
XML注入和注解注入可以同时存在,但是XML优先级高
3 更改需要注入的类
注解注入 --Resource (javax支持)
@Resource 默认是byName:先根据set方法名进行匹配,如果找不到,再根据参数变量名找
如果匹配不上 自动转换为byType
@Resource(name=“xxx”) 设置名字后,会按照设置的名字去找
@Resource相当于@Autowired和@Qualifier一起使用
注解实例化 --Compent
xml中:
扫描该包下的类,如果有实例化注解,就实例化
<context:component-scan base-package="包名,多个用逗号隔开" />
类中:
@Component
默认使用类名首字母小写作为key进行存储 值为当前类实例化对象
可以手动设置@Component(value=“xxx”) 指定名字 value= 可以省略
指定名字后,就把首字母小写名换为指定的名了
@Component相当于父类