Blueherb In solitude, where we are least alone 王佳鑫

spring 学习

https://repo.spring.io/release/org/springframework/spring/5.2.6.RELEASE/

spring 下载地址

 

 

spring test 报错 在Project Structure 的 Modules paths output  path 和 test output path 不一致

 spring xml 方式创建对象:有三种方式

1.<bean id="p" class="com.gql.entity.Person"></bean> 无参构造

2.<bean id="factory" class="com.gql.entity.BeanFactory" factory-method="getInstance"></bean静态工厂

  /** * * 类说明: * 模拟静态工厂 * @guoqianliang1998. */ public class BeanFactory { public static Person getInstance(){ return new Person(); } }

3.<bean id="factory" class="com.gql.entity.BeanFactory"></bean> <bean id="f" factory-bean="factory" factory-method="getInstance"></bean>

/** * * 类说明: * 模拟工厂实例化 * @guoqianliang1998. */ public class BeanFactory { public Person getInstance(){ return new Person(); } } 实例工厂(鸡肋)

 

ioc 原理: 读取xml 、 工厂模式 、反射

ioc 接口:Spring 提供IOC容器实现俩种方式:(俩个接口)

1、BeanFactory:IOC容器基本实现,是Spring 内部的使用接口,不提供开发人员进行使用

* 加载配置文件时不会创建对象,在获取对象(使用)才去创建对象。

2、ApplicationContext:BeanFactory接口的子接口,提供更多更强大的功能,一般由开发人员进行使用

*加载配置文件时候把配置文件对象进行创建

3.ApplicationContext 有实现类

  

FileSystemXmlApplicationContext  电脑目录下  全路径
ClassPathXmlApplicationContext   项目src 目录下



// User类 要有 set 方法
<bean id="user" class="com.atguigu.spring5.User">
<property name="name1" value="zhangsan"></property>
</bean>
// User类 要有 有参构造 方法
<bean id="user" class="com.atguigu.spring5.User">
<constructor-arg name="name1" value="123"></constructor-arg>
</bean>

// 引入约束 xmlns:p="http://www.springframework.org/schema/p"
<bean id="user" class="com.atguigu.spring5.User" p:name1="111">
</bean>

// 设置空值
<bean id="user" class="com.atguigu.spring5.User">
<property name="name1" >
<null/>
</property>
</bean>

// 特殊符号
  1.把<>进行转义 &tls
  2.把带特殊符号内容写到CDATA
<bean id="user" class="com.atguigu.spring5.User">
<property name="name1" >
<value><![CDATA[<<南京>>]]>
</property>
</bean>


bean 和 FactoryBean

1.如何设置单实例还是多实例

  在spring 配置中 scope =‘prototype’ 多实例   simgleton 单实例

       scope =simgleton  在加载配置文件就创建对象

  scope =‘prototype’ 在getBean 的时候创建对象

ICO操作Bean 管理(bean生命周期)

 (1) 通过构造器创建bean实例(无参构造)

(2)为bean 的属性设置值和对其他bean的引用(调用set方法)

(3)调用bean的初始化方法(需要配置初始化的方法)

(4)bean可以使用了(对象获取到了)

(5)当容器关闭时候,调用bean的摧毁方法(需要进行配置摧毁的方法)

 

1.什么是自动装配(根据)

 autowire 属性常用俩个值:

  byName 根据属性名称注入,注入值bean的id 值和类属性名称一样

private Dept dept;
<bean id="user" class="com.atguigu.spring5.User" autowire="byType">
</bean>
<bean id="dept" class="com.atguigu.spring5.Dept"></bean>

  byType 根据属性类型注入,

<bean id="user" class="com.atguigu.spring5.User" autowire="byType">
<bean id="dept" class="com.atguigu.spring5.Dept"></bean>


spring 引入 properties 文件
xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
例子:<bean id="user" class="com.atguigu.spring5.User" autowire="byName">
   </bean>
  <bean id="dept" class="com.atguigu.spring5.Dept">
   <property name="driver" value="${prop.drive}"></property>
  </bean>
  <context:property-placeholder location="classpath:jdbc.properties"/>


IOC操作Bean
   1.什么是注解





1. 使用注解目的:简化xml配置

2、Spring 针对Bean 管理中创建对象提供注解
(1)@Component
(2)@Service
(3)@Controller
(4)@Repository 持久成 dao

  • 上面四个注解功能都是一样的

3.基于注解实现对象创建
第一步,引入aop依赖
spring-aop-*。jar
第二步,开启组件扫码
<context:component-scan base-package="com.atguigu.spring5.testdemo"></contex
第三步,
在注解里面value属性值可以省略不写,默认组是类名称,首字母小写 等价于 bean 注入的id
@Compent(value=userService)

4.基于注解方式实现属性注入
(1)@Autowired :根据属性类型进行自动装配 Interface UserDao (这个类型) 是他的实现类
(2)@Qualifier:根据属性名称进行注入 和上面@Autowired 一起使用,一般默认首字母小写
(3)@Resource:可以根据类型注入,可以根据名称注入
(4)@Value :普通类型注入

@Repository(value = "UserDaoImpl1")
public class UserDaoImpl implements UserDao{
@Override
public void add() {
System.out.println("add++++");
}
}
@Service
public class UserService {

@Autowired
@Qualifier(value = "UserDaoImpl1")
private UserDao userDao;

public void add(){
    System.out.println("service add+++++");
    userDao.add();
}

}

5.完全注解开发
(1)创建配置类,代替xml配置文件
@Configuration // 配置类,代替配置文件
@ComponentScan(basePackages = {"com.atguigu"})
public class SpringConfig {
}
(2)编写测试类
@Test
public void testAdd(){
// 1.加载spring配置文件
ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
UserService userService = context.getBean("userService", UserService.class);
userService.add();
System.out.println( userService);
}

6.AOP
1、连接点
类里面那些方法可以被增强,这些方法称为连接点
2、切入点
实际被真正增加的方法,称为切入点
3.通知(增强)
(1)实际增加的逻辑部分称为通知(增强)
(2)通知有多种类型
前置通知
后置通知
环绕通知
异常通知
最终通知
4.切面
是动作
(1)把通知应用到切入点过程

@Before(value = "execution(* com.atguigu.spring5.aopanno.User.add(..))")
public void before(){
System.out.println("before....");
}

5.相同切入点抽取
@Pointcut(value = "execution(* com.atguigu.spring5.aopanno.User.add(..))")
public void pointDemo(){

}
@Before(value = "pointDemo()")
public void before(){
    System.out.println("before....");
}

6.有多个增强类同一个方法增强,优先级
@Order(1) 数值越小 优先级越高

把不是spring管理的类 注入到容器中
1.创建GenericApplicationContext对象
GenericApplicationContext context = new GenericaApplicationContext();
2.调用context 的方法对象注册
context.refresh();
context.registerBean(User.class,()->new User());
3.获取在spring 注册的对象
User user = (User)context.getBean("com.atigugu.spring5.text5.User");

posted @ 2021-01-22 21:17  阿呆学习之路  阅读(83)  评论(0编辑  收藏  举报