Spring IOC(xml)
//依赖
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.8.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.1.8.RELEASE</version>
</dependency>
</dependencies>
//Person类
@Component("person")
public class Person {
private String name;
private Integer age;
//自定义成员变量
private Computer computer;
public Person() {
super();
}
public Person(String name, Integer age, Computer computer) {
this.name = name;
this.age = age;
this.computer = computer;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Computer getComputer() {
return computer;
}
public void setComputer(Computer computer) {
this.computer = computer;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", computer=" + computer +
'}';
}
}
//Cmputer类
public class Computer {
private String brand;
private String color;
private Double price;
public Computer() {
super();
}
public Computer(String brand, String color, Double price) {
this.brand = brand;
this.color = color;
this.price = price;
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
@Override
public String toString() {
return "Computer{" +
"brand='" + brand + '\'' +
", color='" + color + '\'' +
", price=" + price +
'}';
}
}
xml配置
<context:component-scan base-package="zlb.demo01"></context:component-scan>
//通过set方法注入属性
<!--配置Person-->
<bean id="person" class="zlb.demo01.Person">
<property name="name" value="胡歌"></property>
<property name="age" value="18"></property>
<property name="computer" ref="computer"></property>
</bean>
<!--配置computer-->
<bean id="computer" class="zlb.demo01.Computer">
<property name="brand" value="华硕"></property>
<property name="color" value="白色"></property>
<property name="price" value="5000.00"></property>
</bean>
//通过构造器注入
<!--配置Person-->
<bean id="person" class="zlb.demo01.Person">
<constructor-arg name="name" value="胡歌"></constructor-arg>
<constructor-arg name="age" value="18"></constructor-arg>
<constructor-arg name="computer" ref="computer"></constructor-arg>
</bean>
<!--配置Computer-->
<bean id="computer" class="zlb.demo01.Computer">
<constructor-arg name="brand" value="华硕"></constructor-arg>
<constructor-arg name="color" value="白色"></constructor-arg>
<constructor-arg name="price" value="6000.00"></constructor-arg>
</bean>
测试类
//Spring整合Junit
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations ="classpath:beans.xml")
public class PersonTest {
@Autowired
private Person person;
@Test
public void test(){
System.out.println(person);
}
}
Spring IOC(纯注解)
//Person类
@Component("person")
//通过内路径下的properties文件配置数据
@PropertySource("classpath:computer.properties")
public class Computer {
@Value("${brand}")
private String brand;
@Value("${color}")
private String color;
@Value("${price}")
private Double price;
public Computer() {
super();
}
public Computer(String brand, String color, Double price) {
this.brand = brand;
this.color = color;
this.price = price;
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
@Override
public String toString() {
return "Computer{" +
"brand='" + brand + '\'' +
", color='" + color + '\'' +
", price=" + price +
'}';
}
//Compuer类
@Component("computer")
@PropertySource("classpath:computer.properties")
public class Computer {
@Value("${brand}")
private String brand;
@Value("${color}")
private String color;
@Value("${price}")
private Double price;
public Computer() {
super();
}
public Computer(String brand, String color, Double price) {
this.brand = brand;
this.color = color;
this.price = price;
}
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
@Override
public String toString() {
return "Computer{" +
"brand='" + brand + '\'' +
", color='" + color + '\'' +
", price=" + price +
'}';
}
}
}
//配置类
/*@Configuration 表明这是一个配置类
@ComponentScan 扫描指定包下所有bean对象
* */
@Configuration
@ComponentScan(basePackages = "zlb.demo02")
public class ConfigClass {
}
person.properties文件
name=胡歌
age=18
computer。properties文件
brand=华硕
color=白色
price=5000.00
测试类
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = ConfigClass.class)
public class PersonTest {
@Autowired
private Person person;
@Test
public void test(){
System.out.println(person);
}
}
基于Spring IOC的增删改查
依赖
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.1.8.RELEASE</version>
</dependency>
<dependency>
<groupId>commons-dbutils</groupId>
<artifactId>commons-dbutils</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.1.8.RELEASE</version>
</dependency>
</dependencies>
/*
* 账户实体类
* */
public class Account {
private Integer id;
private String name;
private Double money;
public Account() {
super();
}
public Account(Integer id, String name, Double money) {
this.name = name;
this.id = id;
this.money = money;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Double getMoney() {
return money;
}
public void setMoney(Double money) {
this.money = money;
}
@Override
public String toString() {
return "Account{" +
"name='" + name + '\'' +
", age=" + id+
", money=" + money +
'}';
}
}
/*
* 账户持久层接口
* */
public interface AccountDao {
/*
* 查询所有账户
* */
List<Account> findAllAccount();
/*根据Id查一个账户
* */
Account findAccountById(Integer accountId);
//更新账户
void updateAccount(Account account);
/*
* 插入新账户
* */
void insertAccount(Account account);
/*
* 根据Id删除账户
* */
void deleteById(Integer accountId);
}
/*
* 账户持久层实现类
* */
public class AccountDaoImpl implements AccountDao {
private QueryRunner queryRunner;
public void setQueryRunner(QueryRunner queryRunner) {
this.queryRunner = queryRunner;
}
public List<Account> findAllAccount() {
try {
return queryRunner.query("select * from account", new BeanListHandler<Account>(Account.class));
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public Account findAccountById(Integer accountId) {
try {
return queryRunner.query("select * from account where id=?", new BeanHandler<Account>(Account.class), accountId);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public void updateAccount(Account account) {
try {
queryRunner.update("update account set name=?,money=? where id=?",account.getName(),account.getMoney(),account.getId());
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public void insertAccount(Account account) {
try {
queryRunner.update("insert into account (id,name,money)values(?,?,?)",account.getId(),account.getName(),account.getMoney());
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public void deleteById(Integer accountId) {
try {
queryRunner.update("delete from account where id=?",accountId);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
/*
* 账户业务层接口
* */
public interface AccountService {
/*
* 查询所有*/
List<Account> findAllAccount();
/*根据Id查一个
* */
Account findAccountById(Integer accountId);
//更新
void updateAccount(Account account);
/*
* 插入
* */
void insertAccount(Account account);
/*
* 根据Id删除
* */
void deleteById(Integer accountId);
}
/*
* 账户业务层实现类
* */
public class AccountServiceImpl implements AccountService {
private AccountDao accountDao;
public void setAccountDao(AccountDao accountDao) {
this.accountDao = accountDao;
}
public List<Account> findAllAccount() {
return accountDao.findAllAccount();
}
public Account findAccountById(Integer accountId) {
return accountDao.findAccountById(accountId);
}
public void updateAccount(Account account) {
accountDao.updateAccount(account);
}
public void insertAccount(Account account) {
accountDao.insertAccount(account);
}
public void deleteById(Integer accountId) {
accountDao.deleteById(accountId);
}
}
xml配置
<!--配置业务层-->
<bean id="accountService" class="zlb.service.impl.AccountServiceImpl">
<property name="accountDao" ref="accountDao"></property>
</bean>
<!--配置持久层-->
<bean id="accountDao" class="zlb.dao.impl.AccountDaoImpl">
<!--注入Query-->
<property name="queryRunner" ref="runner"></property>
</bean>
<!--配置Query-->
<bean id="runner" class="org.apache.commons.dbutils.QueryRunner">
<!--注入数据源-->
<constructor-arg name="ds" ref="dataSource"></constructor-arg>
</bean>
<!--配置数据源-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/eesy"></property>
<property name="user" value="root"></property>
<property name="password" value="151630"></property>
</bean>
测试类
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:beans.xml")
public class TestApp {
@Autowired
private AccountService accountService;
@Test
public void findOneById(){
Account account = accountService.findAccountById(3);
System.out.println(account);
}
@Test
public void findAll(){
List<Account> allAccount = accountService.findAllAccount();
for (Account account : allAccount) {
System.out.println(account);
}
}
@Test
public void delete(){
accountService.deleteById(10);
}
@Test
public void update(){
Account account = accountService.findAccountById(3);
account.setMoney(5000d);
account.setName("java");
accountService.updateAccount(account);
}
@Test
public void insert(){
accountService.insertAccount(new Account(35,"spring",6000d));
}
}
基于Spring IOC的增删改查(全注解)
新增一个配置类其他类全用注解配置
@Configuration
@ComponentScan("zlb")
public class SpringConfiguration {
/**
* 创建一个数据源,并存入 spring 容器中
*/
@Bean(name="dataSource")
public DataSource createDataSource() {
try {
ComboPooledDataSource ds = new ComboPooledDataSource();
ds.setUser("root");
ds.setPassword("151630");
ds.setDriverClass("com.mysql.jdbc.Driver");
ds.setJdbcUrl("jdbc:mysql://localhost:3306/eesy");
return ds;
} catch (Exception e) {
throw new RuntimeException(e);
} }
/**
* 创建一个 Query,并且也存入 spring 容器中
*/
@Bean(name="runner")
public QueryRunner createQuery(DataSource dataSource) {
return new QueryRunner(dataSource);
} }
动态代理
/*
* 接口类
* */
public interface IProducer {
//卖产品
void saleProduct(float money);
//售后服务
void afterService(float money);
}
/*
* 实现类生产者
* */
public class Produce implements IProducer {
public void saleProduct(float money) {
}
public void afterService(float money) {
System.out.println(money);
}
}
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class Client {
public static void main(String[] args) {
final Produce produce=new Produce();
final IProducer iProducer =(IProducer) Proxy.newProxyInstance(produce.getClass().getClassLoader(),
produce.getClass().getInterfaces(), new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object value=null;
Float money=(Float)args[0];
if ("afterService".equals(method.getName())) {
value = method.invoke(produce, money * 0.8f);
}
return value;
}
});
iProducer.afterService(10000f);
}
}
SpringAop(xml)
//被通知类
public class Phone {
public void playMusic(Stirng name){
System.out.println("正在播放音乐");
}
}
//通知类
public class Message {
public void beforePrint(){
System.out.println("正在打印前置信息");
}
public void returningPrint(){
System.out.println("正在打印返回信息");
}
public void throwingPrint()
{
System.out.println("正在打印异常信息");
}
public void afterPrint(){
System.out.println("正在打印最终信息");
}
<!--配置被通知类-->
<bean id="phone" class="zlb.dao.Phone"></bean>
<!--配置通知类-->
<bean id="message" class="zlb.Message"></bean>
<!--开启AOP配置-->
<aop:config>
<!--配置切面点-->
<!--说明哪个类是通知类-->
<aop:aspect id="messageAdvice" ref="message">
<aop:before method="beforePrint" pointcut-ref="pt"></aop:before>
<aop:after-returning method="returningPrint" pointcut-ref="pt" ></aop:after-returning>
<aop:after-throwing method="throwingPrint" pointcut-ref="pt" ></aop:after-throwing>
<aop:after method="afterPrint" pointcut-ref="pt"></aop:after>
<!--切面表达式,建立通知类与被通知类的关系-->
<aop:pointcut id="pt" expression="execution(* zlb.dao.*.*(..))"/>
</aop:aspect>
</aop:config>
环绕通知
public class Phone {
public String playMusic(String name){
return name;
}
}
public class Message {
public Object aroundPrint(ProceedingJoinPoint point) {
Object value = null;
String name = point.getSignature().getName();
try {
System.out.println("前置通知开始了,"+"被增强的方法名为:"+name+"参数是"+ Arrays.asList(point.getArgs()));
Object[] args = point.getArgs();
for (int i = 0; i < args.length; i++) {
if (args[i].equals("江南")
) {
value = point.proceed(new Object[]{"醉赤壁"});
}
else {
value=point.proceed();
}
}
System.out.println("返回通知开始了,"+"被增强的方法为:"+name+"返回结果是"+value);
return value;
} catch (Throwable th) {
System.out.println("异常通知开始了,"+"被增强的方法名为:"+name+"异常为"+th);
throw new RuntimeException(th);
} finally {
System.out.println("后置通知开始了,"+"方法;"+name+"结束啦");
}
}
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations ="classpath:beans.xml")
public class TestAop {
@Autowired
private Phone phone;
@Test
public void test(){
phone.playMusic("江南");
System.out.println("============");
phone.playMusic(null);
}
}
SpringAop(全注解)
@Component("phone")
public class Phone {
public void playMusic(){
System.out.println("正在播放音乐");
}
}
@Component("message")
@Aspect
public class Message {
@Pointcut("execution(* zlb.*.*(..))")
public void pt() {
}
@Before("pt()")
public void beforePrint(){
System.out.println("正在打印前置信息");
}
@After("pt()")
public void returningPrint(){
System.out.println("正在打印返回信息");
}
@AfterThrowing("pt()")
public void throwingPrint()
{
System.out.println("正在打印异常信息");
}
@After("pt()")
public void afterPrint(){
System.out.println("正在打印最终信息");
}
}
//配置类
@Configuration
@ComponentScan(basePackages = "zlb")
@EnableAspectJAutoProxy
public class ConfigClass {
}
//测试类
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = ConfigClass.class)
public class AppTest {
@Autowired
private Phone phone;
@Test
public void test(){
phone.playMusic();
}
}