Sprign Framework:Spring框架,是Spring中最早最核心的部分 也是其他技术的基础
SpringBoot:Spring是来简化开发,而SpringBoot是来帮助Spring在简化的基础上能更快速进行开发。
-
SpringCloud:这个是用来做分布式之微服务架构的相关开发。
实例化bean的三种方式,构造方法
,静态工厂和实例工厂
bean本质上就是对象,对象在new的时候会使用构造方法完成,那创建bean也是使用构造方法完成的。
1 构造方法实例化(常用)
Spring底层使用无参构造方法创建对象,在没有有参构造器的时候默认有无参构造器,因此使用构造方法实例化bean时直接在配置文件中配置即可
public class BookDaoImpl implements BookDao {
@Override
public void save() {
System.out.println("dao save");
}
}
//测试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基础配置
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基础配置
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标签注入
//测试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);
}
}
//测试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中配置
//测试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);
}
}
//测试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 list;
private Set set;
private Map map;
private Properties properties;
public void setArray(int[] array) {
this.array = array;
}
public void setList(List list) {
this.list = list;
}
public void setSet(Set set) {
this.set = set;
}
public void setMap(Map 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);
}
}
100
200
300
yuanyuan1
yuanyuan2
yuanyuan3
mysql
mysql
java
China
Chinese
//测试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标签内部也可以写、、
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)