Sprign Framework:Spring框架,是Spring中最早最核心的部分 也是其他技术的基础
SpringBoot:Spring是来简化开发,而SpringBoot是来帮助Spring在简化的基础上能更快速进行开发。
-
SpringCloud:这个是用来做分布式之微服务架构的相关开发。
IOC部分
bean的实例化
实例化bean的三种方式,构造方法
,静态工厂和实例工厂
bean本质上就是对象,对象在new的时候会使用构造方法完成,那创建bean也是使用构造方法完成的。
1 构造方法实例化(常用)
Spring底层使用无参构造方法创建对象,在没有有参构造器的时候默认有无参构造器,因此使用构造方法实例化bean时直接在配置文件中配置即可
public class BookDaoImpl implements BookDao {
@Override
public void save() {
System.out.println("dao save");
}
}
<bean id="bookDao" class="com.dao.impl.BookDaoImpl"></bean>
//测试bean实例化
public class TestDemo2 {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
BookDaoImpl bookDao = context.getBean("bookDao", BookDaoImpl.class);
bookDao.save();
}
}
运行结果:
为了验证是通过无参构造方法获取的 在无参构造方法中输出一句话验证
public class BookDaoImpl implements BookDao {
public BookDaoImpl() {
System.out.println("无参构造方法执行");
}
@Override
public void save() {
System.out.println("dao save");
}
}
运行结果:
2 静态工厂实例化(了解)
3 实例工厂与FactoryBean
bean的基础配置
<!--bean属性-->
<bean id="bookDao" class="com.dao.impl.BookDaoImpl" name="dao" scope="prototype"></bean>
//测试bean基础配置
public class TestDemo2 {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
BookDaoImpl bookDao1 = context.getBean("dao", BookDaoImpl.class);
BookDaoImpl bookDao2 = context.getBean("dao", BookDaoImpl.class);
System.out.println(bookDao1);
System.out.println(bookDao2);
}
}
测试结果:
<!--bean属性-->
<bean id="bookDao" class="com.dao.impl.BookDaoImpl"></bean>
//测试bean基础配置
public class TestDemo2 {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
BookDaoImpl bookDao1 = context.getBean("bookDao", BookDaoImpl.class);
BookDaoImpl bookDao2 = context.getBean("bookDao", BookDaoImpl.class);
System.out.println(bookDao1);
System.out.println(bookDao2);
}
}
测试结果:
id:bean唯一标识
class:bean的类全名 必须为实现类
name:起别名 可起多个 使用(,)(;)( 空格)分割
scope:作用范围
prototype:多例,多次获取的bean为多个 singleton:单例(默认) 多次获取的bean为同一个
bean的生命周期
1 在配置文件中的bean标签中添加init-method
和destroy-method
属性
2 类实现InitializingBean
与DisposableBean
接口,了解
关闭容器的两种方式
ConfigurableApplicationContext是ApplicationContext的子类 close()方法 registerShutdownHook()方法
DI 属性注入
setter注入
setter引用类型注入
1.在BookServiceImpl中声明bookDao属性
private BookDao bookDao;
2.为bookDao属性提供setter方法
public void setBookDao(BookDao bookDao) {
this.bookDao = bookDao;
}
3.在配置文件中使用property标签注入
<bean id="bookDao" class="com.dao.impl.BookDaoImpl"></bean>
<bean id="bookService" class="com.service.impl.BookServiceImpl">
<property name="bookDao" ref="bookDao"></property>
</bean>
//测试DI属性注入
public class TestDemo1 {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
BookService bookService = context.getBean("bookService", BookService.class);
bookService.save();
}
}
运行结果:
setter简单类型注入
public class UserDaoImpl implements UserDao {
private String userName;
public void setUserName(String userName) {
this.userName = userName;
}
@Override
public void name() {
System.out.println("username is "+userName);
}
}
<bean id="userDao" class="com.dao.impl.UserDaoImpl">
<property name="userName" value="yuanyuan"></property>
//测试DI属性注入
public class TestDemo4 {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
UserDaoImpl userDao = context.getBean("userDao", UserDaoImpl.class);
userDao.name();
}
}
运行结果:
构造器注入
构造器引用类型注入
1.将bookDao的setter方法删除掉
2.添加带有bookDao参数的构造方法
public class BookServiceImpl implements BookService {
private BookDao bookDao;
public BookServiceImpl(BookDao bookDao) {
this.bookDao = bookDao;
}
@Override
public void save() {
System.out.println("service save");
bookDao.save();
}
}
3.在applicationContext.xml中配置
<bean id="bookDao" class="com.dao.impl.BookDaoImpl"></bean>
<bean id="bookService" class="com.service.impl.BookServiceImpl">
<constructor-arg name="bookDao" ref="bookDao"></constructor-arg>
</bean>
//测试DI属性注入
public class TestDemo1 {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
BookService bookService = context.getBean("bookService", BookService.class);
bookService.save();
}
}
测试结果:
构造器简单类型注入
public class UserDaoImpl implements UserDao {
private String userName;
public UserDaoImpl(String userName) {
this.userName = userName;
}
@Override
public void name() {
System.out.println("username is "+userName);
}
}
<bean id="userDao" class="com.dao.impl.UserDaoImpl">
<constructor-arg name="userName" value="yuanyuan"></constructor-arg>
</bean>
//测试DI属性注入
public class TestDemo4 {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
UserDaoImpl userDao = context.getBean("userDao", UserDaoImpl.class);
userDao.name();
}
}
测试结果:
依赖自动装配
依赖注入,需要注意一些其他的配置特征:
-
自动装配用于引用类型依赖注入,不能对简单类型进行操作
-
使用按类型装配时(byType)必须保障容器中相同类型的bean唯一,推荐使用
-
使用按名称装配时(byName)必须保障容器中具有指定名称的bean,因变量名与配置耦合,不推荐使用
-
自动装配优先级低于setter注入与构造器注入,同时出现时自动装配配置失效
集合注入
public class ListDaoImpl implements ListDao {
private int[] array;
private List<String> list;
private Set<String> set;
private Map<String,String> map;
private Properties properties;
public void setArray(int[] array) {
this.array = array;
}
public void setList(List<String> list) {
this.list = list;
}
public void setSet(Set<String> set) {
this.set = set;
}
public void setMap(Map<String, String> map) {
this.map = map;
}
public void setProperties(Properties properties) {
this.properties = properties;
}
@Override
public void testDemo() {
System.out.println("book dao save ...");
System.out.println("遍历数组:" + Arrays.toString(array));
System.out.println("遍历List" + list);
System.out.println("遍历Set" + set);
System.out.println("遍历Map" + map);
System.out.println("遍历Properties" + properties);
}
}
<bean id="listDao" class="com.dao.impl.ListDaoImpl">
<property name="array">
<array>
<value>100</value>
<value>200</value>
<value>300</value>
</array>
</property>
<property name="list" >
<list>
<value>yuanyuan1</value>
<value>yuanyuan2</value>
<value>yuanyuan3</value>
</list>
</property>
<!-- set 去重-->
<property name="set">
<set>
<value>mysql</value>
<value>mysql</value>
<value>java</value>
</set>
</property>
<property name="map">
<map>
<entry key="name" value="yuanyuan"></entry>
<entry key="password" value="1234"></entry>
</map>
</property>
<property name="properties">
<props>
<prop key="county">China</prop>
<prop key="language">Chinese</prop>
</props>
</property>
</bean>
</beans>
//测试DI属性注入
public class TestDemo5 {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("application.xml");
ListDaoImpl listDao = context.getBean("listDao", ListDaoImpl.class);
listDao.testDemo();
}
}
测试结果:
property标签表示setter方式注入,构造方式注入constructor-arg标签内部也可以写<array>、<list>、<set>、<map>、<props>标签
List的底层也是通过数组实现的,所以`<list>`和`<array>`标签是可以混用
集合中要添加引用类型,只需要把`<value>`标签改成`<ref>`标签,这种方式用的比较少